2011-03-22 121 views
0

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

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的for循环外还我有错误为“无效的命令”
  • 我也试过在SSH,但它提示用户名和密码

回答

0
files=`ls filename` 

认沽反引号,周围的命令不是简单的报价,以获取其输出。

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

0

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

而且,这是一个非常糟糕的主意来遍历文件使用

files=`ls files` 
for file in $files 

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

for file in *

,但它不适合:如果*(或ls输出)会扩展超过命令行缓冲区,它会失败。一个相当可扩展的解决方案是这样的:

find . | while read file do 
    do_something_with $file 
done

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

0

完全过时的解决方案:

替换行

`rm -rf $file` 

`!rm -rf $file` 

这是因为,在代码中的那个地方你的FTP主机,直到EOFD上字符串已到达,因此要在本地系统(源)上运行任何命令,需要以前缀!作为前缀。

最好的测试方法是手动执行命令。以下是我已经测试:

[email protected]:~$ 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. 
[email protected]:~$ 

或者另一种解决方案,

再次使用for循环一样,完整的FTP完成遍历组相同的文件并将其删除后。