仅复制(Rsync)子目录中的文件

仅复制(Rsync)子目录中的文件

如果能得到一些帮助我真的很高兴。让我们想象一下目录结构的快照:

../test1/test6/test62.txt
../test1/test6/test65.txt
../test1/test6/test67.txt
../test1/test6/test69.txt
../test1/test6/test60.txt
../test1/test6/test68.txt
../test1/test6/test63.txt
../test1/test6/test66.txt
../test1/test6/test64.txt
../test1/test6/test61.txt
../test2/test1/test2.txt
../test2/test1/test9.txt
../test2/test1/test1.txt
../test2/test1/test6.txt
../test2/test1/test3.txt
../test2/test1/test8.txt
../test2/test1/test4.txt
../test2/test1/test10.txt
../test2/test1/test5.txt
../test2/test1/test7.txt

我的最终目标是将所有 .txt 文件复制到一个新目录(例如 target )中。

现实中还有很多目录。

我发现了一个非常好的 cp 命令:

cp ../**/**/*.txt .

但有一个问题。文件很多,比如 250GB 的图像,因此 cp 错误如下:

Argument list too long

我读了一些关于如何使用 rsync 执行此操作的内容,这似乎是正确的方法,但我无法全神贯注于编写命令以及确切排除和包含哪些内容。

答案1

所有目录路径都以 . 开头有点奇怪..。就我个人而言,我建议您提升一个级别并将文件复制/移动/链接到指定的子目录中。

但是,这将允许..并确保您最终不会尝试复制以前已复制的文件

find ../ -mindepth 3 -type f -name '*.txt' -exec cp --target-directory . -- {} +

ln如果cp链接足够而不是复制,您可以顺便查看。同样mv,如果移动是期望的意图。cp -p如果您想尝试保留权限、时间戳等,请使用。

请注意,如果您有两个或多个同名文件,则除最后一个复制之外的所有文件都将被覆盖。如果您使用mv除最后一个之外的所有内容,则会丢失。如果你只使用ln第一个就会成功链接。

答案2

我找到了一种可行的可行解决方案。它使用 find 和 rsync:

find ../. -type f -name "*.txt" -exec rsync -av {} . \;

相关内容