【问题标题】:Bash script to delete remote files based on local file matches根据本地文件匹配删除远程文件的 Bash 脚本
【发布时间】:2020-03-02 21:48:13
【问题描述】:

这是我在本地运行的 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 会话期间也不起作用。

【问题讨论】:

  • rm some_pattern_*.txt?
  • @KamilCuk 存在与我不想删除的模式匹配的远程文件。首先创建要删除的文件列表是我的要求的一部分,并且在问题中已指定。
  • 你说“我有一个理由”,但请相信我,问这个问题的人的“理由”往往是错误的假设。
  • 那我就不明白了。您是在连接到远程服务器之前还是之后创建要删除的文件列表?

标签: bash unix sftp


【解决方案1】:

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

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

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

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

【讨论】:

  • 您能解释一下“将它们发送到服务器”是什么意思吗?每个单独的rm 命令是否分别发送到服务器?
【解决方案2】:
ssh  $username@$host  "ls -1 | grep -v some_pattern_*.txt |  xargs rm"

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

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

【讨论】:

  • 再一次,rm some_pattern_*.txtgrep -v some_pattern_*.txt 也必须是 grep -v 'some_pattern_*.txt',否则 * 将扩展。为什么-v - OP 要求删除some_pattern_*.txt 文件,而不是删除所有其他文件。和you should not parse ls output。并且ssh 可能不适用于OP,只有sftp。也请在这种情况下使用 xargs -d$'\n' - xargs 解析 "' 和 \ 和空格,而不使用分隔符。
  • 谢谢。实际上OP不想删除 some_patterntxt **!**ls some_pattern_.txt > delete_list.txt 因此 grep -v 。是的。我应该在引号中提供字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 2021-01-17
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 2018-09-12
相关资源
最近更新 更多