我有一台带有大量编号目录的远程计算机,如下所示:
dir1 dir2 dir3 ... dir40
每个文件都包含几个编号的文件:
file1 file2 file3 ... file2530
我只想复制每个目录中选定范围的文件。由于每个目录中的文件名都相同,因此我想在本地计算机上重新创建目录层次结构。但既然我不想每一个文件,我不能只用来scp -r
复制目录中的每个文件。
我无法在远程计算机上使用 ssh 密钥建立自动连接,因此我更喜欢一种不涉及重复调用远程复制命令的方法。这些文件也很大,所以我不想只是复制整个文件并删除我不想要的文件rm
并进行大括号扩展。
如何从远程计算机复制一组文件以及这些文件的父目录,同时保留目录结构,而不复制这些目录中的每个文件?
答案1
您可以使用rsync
,它只会对远程执行一次 ssh,并为其提供完整的文件列表或要复制或不复制的文件的 glob 模式列表。例如,
rsync -navR --exclude='*-[4-9]?.out' --exclude='*-3[3-9].out' --exclude='*-???*.out' myremote:'dir*' mylocaldir
这将排除诸如file-40.out
2 个字符从 40 到 99、也file-33.out
到 39 以及file-100.out
更大的文件名。使用所示选项运行命令-n
以收集将要传输的名称列表,如果可以,请删除该选项以实际执行复制。
请注意,其全局模式rsync
不支持大括号。{}
指定要复制的文件的其他方法取决于排除模式的奇特程度,但万无一失的方法是使用-n
不排除模式来获取完整的名称列表,然后编辑此列表并将其作为--files-from
文件列表提供。您还需要dir*
从远程目标中删除:
rsync -av --files-from=list myremote: mylocaldir