有选择地从远程目录集合中复制

有选择地从远程目录集合中复制

我有一台带有大量编号目录的远程计算机,如下所示:

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.out2 个字符从 40 到 99、也file-33.out到 39 以及file-100.out更大的文件名。使用所示选项运行命令-n以收集将要传输的名称列表,如果可以,请删除该选项以实际执行复制。

请注意,其全局模式rsync不支持大括号。{}指定要复制的文件的其他方法取决于排除模式的奇特程度,但万无一失的方法是使用-n不排除模式来获取完整的名称列表,然后编辑此列表并将其作为--files-from文件列表提供。您还需要dir*从远程目标中删除:

rsync -av --files-from=list  myremote: mylocaldir

相关内容