通过 SSH 删除文件列表

通过 SSH 删除文件列表

我正在尝试执行以下操作:

检索与 glob 模式匹配的远程文件列表:

existing_files=$(ssh [email protected] "ls pattern*")

添加与模式匹配的新文件:

scp pattern_matching_file [email protected]:

现在我想删除其中的文件$existing_file而不删除新创建的文件,但我不确定如何操作。

答案1

你有

scp pattern_matching_file [email protected]:

然后你想删除该目录中的所有文件除了对于您刚刚转移的那个。这里有两个建议:

  1. 删除复制前的所有文件

    ssh -qn [email protected] 'find -maxdepth 1 -type f -name '*pattern*' -delete'
    
  2. 删除除刚刚复制的文件之外的文件

    ssh -qn [email protected] 'find -maxdepth 1 -type f \( -name 'keep_this_file' -o -name '*pattern*' -delete \)'
    

在这两种情况下,根据实际的目标路径,您可能会很高兴省略-name '*pattern*'删除指定目录中的所有内容(包括点文件)。该find命令采用简化的 shell glob 模式-name,因此应该使用pattern您为 提供的原始命令ls

替换-delete-print在应用任何理论之前对其进行测试。


如果您想检索与某个模式匹配的文件列表,您可以使用ls {pattern},但这也会下降到任何匹配的目录。该-d标志可以避免这种情况,但如果任何文件名包含换行符,您仍然会遇到复杂的情况\n。特别是如果您稍后要使用该列表来删除文件。

作为替代方案,您可以构建这样的文件数组

files=()
while IFS= read -r -d '' file
do
    files+=("$file")
done < <( ssh -qn [email protected] find -maxdepth 1 -name '*pattern*' -print0 )

# Show what we caught
for file in "${files[@]}"; do echo ">$file<"; done

相关内容