如何将同一文件从不同目录复制到不同目录

如何将同一文件从不同目录复制到不同目录

我有多个包含相同文件(远程)的目录,并且我想将它们复制到本地计算机上的多个目录。

假设我有遥控器

~/remote_folder/folder1/Myfile.log
~/remote_folder/folder2/Myfile.log
~/remote_folder/folder3/Myfile.log

请注意,除了 Myfile.log 之外,文件夹目录中还有其他文件。

我想要的本地内容:

~/local_folder/folder1/Myfile.log
~/local_folder/folder2/Myfile.log
~/local_folder/folder3/Myfile.log

这里我只想要 Myfile.log,而不是来自远程的其他文件。

所以我首先得到的是(我使用 bash 脚本):

for folder in ~/remote_folder/*/
do
                dirr="$(basename $folder)" 
                scp "$folder"Myfile.log user@host:~/local_folder/"$dirr"/
done

然而,这只对前 5 个文件夹有效,然后我的连接被拒绝,可能是因为 ssh 连接太多。

有什么我可以做的吗

scp ~/remote_folder/*/Myfile.log user@host:~/local_folder/*/

或者类似的东西,但至少我只用一个 ssh 连接就可以做到这一点?

答案1

你可以使用rsync以下方法:

rsync -r --prune-empty-dirs --include='/*/' --include='/*/Myfile.log' --exclude='*' user@host:remote_folder/ local_folder/

包含/排除模式是这里唯一稍微有点棘手的部分。Rsync 根据第一个匹配项包含或排除。并且只有模式包含的目录才会被递归到。因此我们使用:

  1. -r进行递归复制。
  2. --include='/*/'递归到同步根的每个第一级子目录。
  3. --include='/*/Myfile.log'包含您想要从每个目录中同步的特定文件。
  4. --exclude='*'忽略其他一切。
  5. --prune-empty-dirs以防止创建Myfile.log不存在的目录的(空)副本。如果每个目录都有Myfile.log,或者您不关心空目录的创建,则可以关闭此选项。

-n您可以通过添加和-v选项来测试它,以rsync查看在实际进行复制之前将复制什么。

另一种选择是通过管道rsync使用:tarssh

cd ~/local_folder
ssh user@host "cd ~/remote_folder && tar cf - */Myfile.log" | tar xf -

就我个人而言,我更喜欢使用这种方法,rsync因为在进行任何复制之前,你可以使用它-n -v来准确查看你将得到的结果。但这两种解决方案应该会给你相同的结果。

相关内容