Bash脚本根据本地文件匹配项删除远程文件

时间:2020-03-02 21:48:13

标签: bash unix sftp

这是我在本地运行的bash脚本:

#!/usr/bin/bash

ls some_pattern_*.txt > deletion_list.txt
rm $(cat deletion_list.txt)
rm deletion_list.txt

exit 0

它的作用是查找与特定模式匹配的文件,并将该文件列表输出到名为deletion_list.txt的文本文件中。然后,脚本将删除文本文档中指定的所有文件,然后最终删除deletion_list.txt本身。这听起来确实很令人费解,但是我有这样做的理由。

这是我尝试通过sftp连接在远程主机上运行的经过稍微修改的版本:

#!/usr/bin/bash

sftp -i ~/.ssh/myprivatekey $username@$host <<-EOF
lcd /home/mydirectory
!ls some_pattern_*.txt > deletion_list.txt
rm $(cat deletion_list.txt)
!rm deletion_list.txt
EOF

exit 0

这应该做的是:

1)使用sftp连接到远程主机(如果建议使用ssh,则在远程主机上未启用ssh

2)更改本地目录

3)创建要从我们所在的本地目录中删除的文件列表,并将deletion_list.txt本地存储在同一目录中

4)基于deletion_list.txt中的文件从远程主机删除文件-删除操作是远程进行的,要删除的文件列表是本地的(deletion_list.txt是根据本地文件创建的,然后从远程主机删除相同的文件。

我在第4步中遇到了问题。我不知道如何删除从本地文件输入的远程文件。

编辑:

正如某人指出的那样,cat在SFTP会话期间也不起作用。

2 个答案:

答案 0 :(得分:3)

ssh不可用时,您将无法执行$(cat ...)

但是您可以在本地创建rm命令并将其发送到服务器:

find -printf 'rm %f\n' -name 'pattern' | \
   sftp -b - server:`pwd`

注意:您可能需要一个额外的层以确保正确的引用(例如,当文件名包含空格或换行符时会发生什么?)。

答案 1 :(得分:0)

ssh  $username@$host  "ls -1 | grep -v some_pattern_*.txt |  xargs rm"

https://linux.die.net/man/1/xargs

xargs->转换命令的管道输入输入参数