使用ftp删除文件

时间:2011-03-22 12:47:13

标签: shell unix ftp

我开发了一个shell脚本,用于将文件从源复制到目标,同时删除源中复制的文件。我可以复制文件,但不能在源端删除文件。

files='ls filename'
for file in $files
do
ftp -vn $hostname <<EOFD
  quote USER $username
  quote PASS $password
binary
 cd $start_dir
 rm -rf $file
quit
EOFD
done
  • 我收到的错误是“找不到这样的文件或目录”
  • 通过将ftp放在forloop之外,我也得到错误''无效命令'
  • 我也在ssh中试过,但它提示输入用户名和密码

3 个答案:

答案 0 :(得分:0)

files=`ls filename`

使用反引号,而不是命令周围的简单引号来获取其输出。

我也在ssh中试过,但它提示输入用户名和密码 - 请检查 SSH-Login without password

答案 1 :(得分:0)

使用输入流将FTP命令直接编写到ftp通常是一个坏主意:它没有任何错误处理,它可能完全错误,你没有机会控制它。如果您有机会使用saner命令行客户端,例如lftpcurl或类似的可编写脚本的客户端。

此外,使用

迭代文件是一个非常糟糕的主意
files=`ls files`
for file in $files

稍微好一点的解决方案是:

for file in *

但它没有扩展:如果*(或ls输出)扩展超过命令行缓冲区,它将失败。一个相当可扩展的解决方案就像:

find . | while read file do
  do_something_with $file
done

......但它可能不是你想要的。实际上,如果您只想将文件从源传输到目标,然后从源头删除文件,则可以使用lftp mput命令和-E选项在传输后删除文件,或与rsync --remove-source-files类似的东西。

答案 2 :(得分:0)

全面解决方案:

替换

`rm -rf $file` 

`!rm -rf $file`

这是因为,在代码中的那个位置,你在ftp控制台上,直到达到EOFD字符串,所以要在本地系统(源)上运行任何命令,你需要!到加上前缀。

测试的最佳方法是手动执行命令。这是我测试过的:

mtk4@laptop:~$ ftp XXX.XXX.XXX
Connected to static-XX-XX-XX-XX.XXXXXX.com.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 2 of 50 allowed.
220-Local time is now 07:52. Server port: 21.
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Name (XXXXXX.XXX:XXX): XXXXXXX 
331 User XXXXXXX OK. Password required
Password:
230 OK. Current restricted directory is /
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> lcd test/
Local directory now /home/mtk4/test
ftp> pwd
257 "/" is your current location
ftp> !pwd
/home/mtk4/test
ftp> !ls
sample.txt
ftp> !rm sample.txt 
ftp> !ls
ftp> bye
221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
221 Logout.
mtk4@laptop:~$ 

或另一种解决方案,

在完成ftp之后再次使用相同的for循环来迭代同一组文件并删除它们。