2012-04-04 84 views
3

如何在对所有文件执行wget后在服务器中删除文件?
我了解删除命令的作品,当你已经做了一个ftp到服务器,但我无法使用该命令,而运行一个shell脚本。下面是我的剧本,请让我知道它有什么不对。使用shell脚本删除服务器中的文件

#!/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 2012-04-04 19:13:29

回答

5

你想

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 
-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 
+0

请参阅我的答案中的链接,说明为什么你应该避免在反引号中使用“ls”。 – tripleee 2012-04-04 19:19:05

+0

我知道壳可以做globbing。但至少我把单引号(哪些)是错误的**改成了可用的东西。 (没有测试,不想在这里启动FTP) – wildplasser 2012-04-04 19:26:06

+0

如果名称中有空白的文件,或者通配符匹配目录,它将会失败。修复很简单;不要使用'ls',也不要试图将glob的结果放入变量中。 – tripleee 2012-04-04 20:08:21

0

如果它是一个选择,我推荐使用ncftpget,而不是普通的FTP,因为它的功能,使之友好到脚本这样。

0

ftp命令

prompt 
mdel *20120330* 
相关问题