我开发了一个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
答案 0 :(得分:0)
files=`ls filename`
使用反引号,而不是命令周围的简单引号来获取其输出。
我也在ssh中试过,但它提示输入用户名和密码 - 请检查 SSH-Login without password 。
答案 1 :(得分:0)
使用输入流将FTP命令直接编写到ftp
通常是一个坏主意:它没有任何错误处理,它可能完全错误,你没有机会控制它。如果您有机会使用saner命令行客户端,例如lftp
,curl
或类似的可编写脚本的客户端。
此外,使用
迭代文件是一个非常糟糕的主意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循环来迭代同一组文件并删除它们。