用一个例子更容易解释这一点。想象一下我的目录结构如下:
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