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