下面是我在本地运行的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会话期间也不工作。
发布于 2020-03-02 22:46:24
当ssh不可用时,您将无法执行$(cat ...)。
但是您可以在本地创建rm命令并将它们发送到服务器:
find -printf 'rm %f\n' -name 'pattern' | \
sftp -b - server:`pwd`注意:您可能需要一个额外的层来确保引用正确(例如,当文件名包含空格或换行符时会发生什么情况?)
发布于 2020-03-03 10:04:53
ssh $username@$host "ls -1 | grep -v some_pattern_*.txt | xargs rm"https://linux.die.net/man/1/xargs
xargs ->转换命令的管道输入输入参数。
https://stackoverflow.com/questions/60497141
复制相似问题