![仅复制(Rsync)子目录中的文件](https://linux22.com/image/224921/%E4%BB%85%E5%A4%8D%E5%88%B6%EF%BC%88Rsync%EF%BC%89%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6.png)
如果能得到一些帮助我真的很高兴。让我们想象一下目录结构的快照:
../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 {} . \;