这是我在本地运行的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会话期间也不起作用。
答案 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->转换命令的管道输入输入参数