我有多个包含相同文件(远程)的目录,并且我想将它们复制到本地计算机上的多个目录。
假设我有遥控器
~/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 根据第一个匹配项包含或排除。并且只有模式包含的目录才会被递归到。因此我们使用:
-r
进行递归复制。--include='/*/'
递归到同步根的每个第一级子目录。--include='/*/Myfile.log'
包含您想要从每个目录中同步的特定文件。--exclude='*'
忽略其他一切。--prune-empty-dirs
以防止创建Myfile.log
不存在的目录的(空)副本。如果每个目录都有Myfile.log
,或者您不关心空目录的创建,则可以关闭此选项。
-n
您可以通过添加和-v
选项来测试它,以rsync
查看在实际进行复制之前将复制什么。
另一种选择是通过管道rsync
使用:tar
ssh
cd ~/local_folder
ssh user@host "cd ~/remote_folder && tar cf - */Myfile.log" | tar xf -
就我个人而言,我更喜欢使用这种方法,rsync
因为在进行任何复制之前,你可以使用它-n -v
来准确查看你将得到的结果。但这两种解决方案应该会给你相同的结果。