使用 scp 获取多个目录中的所有文件

使用 scp 获取多个目录中的所有文件

我的目录结构类似于A1/B1/C1/files111*、、、等,因此所有目录中的所有文件都是唯一的。有没有办法使用 scp A1/B1/C2/files112*A1/B2/C1/files121*A1/B2/C2/files122*其他工具)files###*一次性提取所有终端文件?

答案1

由于您没有在问题中指定这一点,我会假设目录结构是远程的,并且您希望它是本地的。

您需要做的是使用通配符,但在客户端对其进行转义,以便您的本地 shell 忽略它们并传递它们。将其与递归标志 ( -r) 结合使用,它应该会按照您想要的方式执行:

scp -r remotemachine:some/directory/files\*   /some/local/target/directory/

重要的部分是反斜杠,因为它会使您的本地 shell 忽略星号,并将其传递下去。这应该允许您files*从远程拉取所有内容,包括子目录。它还将拉取名称以 开头的任何实际文件files*

答案2

首先,您必须考虑您希望以这种方式复制的文件发生什么,以及这会如何影响未来的复制操作。它们会留在那里吗?它们会被删除吗?存档吗?一旦您知道了这些,您就可以构建复制命令,然后执行必要的清理操作。这是一个示例脚本,它首先复制所有现有文件,然后从远程服务器中删除它们。

文件在复制和删除操作之间可能会发生变化,因此我首先将它们移动到临时目录,然后从那里复制并删除它们,以允许工作目录继续正常运行。

我还会创建一个 cron 作业,以便每天同一时间自动检索这些文件,并添加一些健全性检查,以确保操作成功完成。

#!/bin/bash
HOST="RemoteServerIPorHostName"
localDir="/some/local/dir"

for remoteTargets in "/A1/B1/C1/files111*" "/A1/B1/C2/files112*" "/A1/B2/C1/files121*" "/A1/B2/C2/files122*"
do
    scp -pr user@$HOST:$remoteTargets $localDir
    ssh -t user@$HOST 'rm -rf $remoteTargets'
done

答案3

ssh user@remote "find /target/A1 -iname \"*files*\" -exec scp {} user@local:/desitnation \;"
  • ssh连接到远程计算机并执行双引号括起来的代码""
  • find/target/A1目录内搜索包含关键字“files”的所有文件。请注意,您需要使用反斜杠来表示不区分大小写的搜索参数-iname,并使用双引号来避免过早离开前一对。
  • -exec是另一个find参数,用于执行代码。在我们的例子中,我们执行scp并将所有搜索结果从find传递到 ,scp并使用弧形括号{}
  • scp将找到的文件复制到本地或任何其他机器。

这在我的测试设置中有效,因为我已经交换了公钥以便使用无需密码的身份验证。

相关内容