Bash 根据本地文件匹配删除远程文件的脚本
Bash script to delete remote files based on local file matches
这是一个 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 会话期间也不起作用。
当ssh
不可用时,您将无法进行$(cat ...)
。
但您可以在本地创建 rm
命令并将它们发送到服务器:
find -printf 'rm %f\n' -name 'pattern' | \
sftp -b - server:`pwd`
注意:您可能需要一个额外的层来确保正确引用(例如,当文件名包含 space 或换行符时会发生什么?)。
ssh $username@$host "ls -1 | grep -v some_pattern_*.txt | xargs rm"
https://linux.die.net/man/1/xargs
xargs --> 转换管道输入命令的输入参数
这是一个 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 会话期间也不起作用。
当ssh
不可用时,您将无法进行$(cat ...)
。
但您可以在本地创建 rm
命令并将它们发送到服务器:
find -printf 'rm %f\n' -name 'pattern' | \
sftp -b - server:`pwd`
注意:您可能需要一个额外的层来确保正确引用(例如,当文件名包含 space 或换行符时会发生什么?)。
ssh $username@$host "ls -1 | grep -v some_pattern_*.txt | xargs rm"
https://linux.die.net/man/1/xargs
xargs --> 转换管道输入命令的输入参数