如何使用sftp删除多个文件


13

这篇文章是关于在设置sftp passwordless连接时从远程服务器删除多文件的。我有下面的代码。$file_list当我将变量设置为时,仅删除变量中的第一个文件,

$file_list="file1 file2"

sftp $USER@$HOST
rm $file_list
quit
SFTP-Session

我什至尝试在提示模式下执行命令。

sftp $USER@$HOST
rm file1 file2

但是,我仍然看到只有file1被删除。

我不确定是否缺少任何基本命令。我尝试了mdelete/ mdel/ mrm,但在sftp提示窗口中被拒绝为无效命令

Answers:


8

这是可以添加到bash脚本中的一种可能的解决方案。这是不理想的,因为它将为每个文件建立一个新的连接。

#!/bin/bash
# set variables
USER="username"
HOST="hostname"
file_list="file1 file1 file3 file4"
# delete each file
for file in $file_list; do
    echo "rm $file" | sftp $USER@$HOST
done
exit 0

这种单线要好得多!file1-9是要删除的文件名,如果需要,可以使用变量,这是同一回事。

for file in file1 file2 file3 file4 file5 file6 file7 file8 file9; do echo -e "rm $file" >> sftp_batch; done; sftp -b sftp_batch username@hostname; rm sftp_batch

如果文件名中带有空格怎么办?这个解决方案行得通吗?
codeforester

您可以引用文件名。如果您有很多,我建议您研究bash参数扩展以获得最佳结果。通常,为简单起见,管理员将不允许使用带有空格和相关字符的文件名。
mbiber

1

您不能在中给rm命令列表sftp,只能使用手册页中写的一个路径:

rm path
    Delete remote file specified by path.

1

我通常lftp会这样做。

设置-Rmeote服务器上的Skinner
$ mkdir adir
$ touch afile1 afile2
$ ls
afile1  afile2
现在我们删除
$ file_list="afile1 afile2"
$ lftp sftp://sam@skinner -e "cd ~/adir; mrm $file_list"
cd ok, cwd=/home/sam/adir    
rm ok, 2 files removed                 
lftp sam@skinner:~/adir> ls
drwxr-xr-x    2 sam      users        4096 Nov  4 11:52 .
drwxr-x---  131 sam      users       20480 Nov  4 11:51 ..
lftp sam@skinner:~/adir> bye

使其成为一个命令:

$ lftp sftp://sam@skinner -e "cd ~/adir; mrm $file_list; bye"

我无法执行lftp命令,可能是因为它需要一些库文件。
bhawna 2014年

@bhawna-可能未安装。
slm

1

如果可以sftp,就不能运行ssh吗?如果是这样,则执行以下命令:

 ssh user@hostname rm file1 file2 

应该工作正常。如果您使用公用/专用SSH密钥,则不会出现密码提示。


是的,它可以工作,但是上面的命令不会创建任何日志信息,并且要求也要创建日志(尽管我没有在问题中指定它)。谢谢
bhawna 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.