使用Shell脚本删除服务器中的文件

3

在使用wget下载所有文件后,您如何在服务器中删除一个文件?
我知道在通过ftp进入服务器后,删除命令可以正常工作,但是在运行shell脚本时我无法使用该命令。以下是我的脚本,请告诉我其中有什么问题。

#!/bin/bash
wget -r -np -nH --cut-dirs=2 -R index.html http://www.example.com/
rm /path/to/file
#!/bin/bash

filelist='ls *20120330*'
for file in $filelist
do
ftp -vn <$hostname> <<EOFD
  quote USER <username>
  quote PASS <Pass>
binary
 ls -lrt *20120330*
 delete $filelist
quit
EOFD
done

3
你考虑过使用rsync吗? - johnsyweb
5个回答

5

You want

for file in *20120330*

与其循环遍历字面意义的单词 ls*20120330*,不如直接获取文件列表。如果您的实际用例非常复杂,可能有理由将文件列表保存在变量中,但我猜测您并不需要这样做。

(你可能一开始想的是

)
for file in `ls *20120330*`

但是这种做法也是错误的,原因不同但相关。参见http://porkmail.org/era/unix/award.html#ls
顺便提一下,你最好创建一个脚本来删除所有文件名,而不是为要删除的每个文件创建一个新的ftp会话;
#!/bin/bash

dellist=
nl='
' # yeah, nl is a newline in single quotes
for file in *20120330*
do
    dellist="delete $file$nl"
done
ftp -vn <$hostname> <<EOFD
  quote USER <username>
  quote PASS <Pass>
  binary
  ls -lrt \*20120330\*
  $dellist
  quit
EOFD

0

尝试使用rm而不是delete


0
如果可以选择的话,我建议使用ncftpget而不是普通的ftp,因为它具有使其更适合此类脚本编写的功能。

0

FTP命令

prompt
mdel  *20120330*

-1
#!/bin/bash
username=luser
password=secret
hostname=localhost

filelist=`ls *20120330*`
for f in $filelist; do
ftp -vn ${hostname} <<EOFD
  USER ${username}
  PASS ${password}
  binary
  ls -l ${f}
  delete ${f}
  quit
EOFD
done

请查看我的回答中的链接,了解为什么应该避免在反引号中使用 ls - tripleee
我知道 shell 可以做 globbing。但至少我已经把单引号(它们)错误的问题纠正成可用的东西了。(没有测试,不想在这里启动 FTP) - wildplasser
如果文件名中有空格或通配符匹配到一个目录,那么它将失败。修复方法很简单:不要使用 ls 命令,并且不要尝试将 glob 的结果放入变量中。 - tripleee
是的,没错。当文件数量大于ARG_MAX时,它也会失败。(使用shell-globbing的方法也是一样) - wildplasser
实际上,shell(在相当现代的实现中)将处理通配符,这些通配符扩展到超过ARG_MAX字节,只要命令是shell内置的。限制在于exec调用系列。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接