我的目录结构类似于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
将找到的文件复制到本地或任何其他机器。
这在我的测试设置中有效,因为我已经交换了公钥以便使用无需密码的身份验证。