Rsync

如何同步大型目錄樹,但只有與正則表達式匹配的葉目錄?

  • August 10, 2020

這更容易用一個例子來解釋。想像一下,我有一個目錄結構如下:

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 腳本來完成它,但這似乎是一個案例,雖然不常見,但我肯定會不時出現,也許有一個名字和此操作的標誌。

您可以獲取所有葉節點,過濾它們grep並將結果保存到文件中。

然後您rsync使用該--files-from選項執行。

這只是基礎知識。例如,您可以直接過濾awk和/或直接通過管道傳輸到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

引用自:https://unix.stackexchange.com/questions/603702