如何rsync大型目录树,但仅同步与正则表达式匹配的叶目录?

如何rsync大型目录树,但仅同步与正则表达式匹配的叶目录?

用一个例子更容易解释这一点。想象一下我的目录结构如下:

pics/cats/png/01.png
pics/cats/png/02.png
pics/cats/jpg/01.jpg
pics/cats/jpg/02.jpg
pics/dogs/png/01.png
pics/dogs/png/02.png
pics/dogs/jpg/01.jpg
pics/dogs/jpg/02.jpg

我想将“pics”目录同步到目的地,但在目的地上我想要以下结果,假设我的叶目录的过滤字符串是“png”:

pics/cats/png/01.png
pics/cats/png/02.png
pics/dogs/png/01.png
pics/dogs/png/02.png

另外,我还想实现以下结果:(因为不再需要 png 目录)

pics/cats/01.png
pics/cats/02.png
pics/dogs/01.png
pics/dogs/02.png

值得注意的是,任何目录中都可能包含字符串“png”,但我只想“过滤”叶目录,即不包含其他目录的目录。

还需要注意的是,我想保留“png”目录的内容,即使它们包含非 png 文件。 IE:

pics/cats/png/01.png
pics/cats/png/02.txt
pics/cats/jpg/01.jpg
pics/cats/jpg/02.jpg
pics/dogs/png/01.txt
pics/dogs/png/02.png
pics/dogs/jpg/01.jpg
pics/dogs/jpg/02.jpg

变成:

pics/cats/png/01.png
pics/cats/png/02.txt
pics/dogs/png/01.txt
pics/dogs/png/02.png

或者:

pics/cats/01.png
pics/cats/02.txt
pics/dogs/01.txt
pics/dogs/02.png

最后要注意的一点:目录结构可能有“n”深。 IE:

pics/cats/house/tabby/png/01.png
pics/cats/house/tabby/png/02.txt
pics/cats/house/tabby/jpg/01.jpg
pics/cats/house/tabby/jpg/02.jpg

变成:

pics/cats/house/tabby/png/01.png
pics/cats/house/tabby/png/02.txt

或者:

pics/cats/house/tabby/01.png
pics/cats/house/tabby/02.txt

如果不存在简单的方法,我确信我可以编写一个 bash 脚本来完成它,但这似乎是一个用例,虽然不常见,但我确信时不时会出现,也许有一个名称和此操作的标志。

答案1

你可以获取所有叶子节点,使用过滤它们grep并将结果保存到文件中。

然后你rsync用这个--files-from选项运行。

这只是基础知识。例如,您可以直接过滤awk和/或直接通过管道传输到 to 。xargs我并不是要简洁或高效,而是要展示所涉及的步骤。

如果您位于层次结构的根部:

$ find . -type d | sort | awk '$0 !~ last "/" {print last} {last=$0} END {print last}' | grep '/png$' > /tmp/dirs_rsync.txt

$ rsync -av --files-from=/tmp/dirs_rsync.txt . /your/destination/folder

相关内容