Bash
使用 rsync 移動文件和刪除目錄?
最近我需要刪除大量文件(超過 100 萬個),我讀到這樣做:
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
是最優化的方法之一,我可以保證它比
rm -rf
.我不是這方面的專家,但據我了解,rsync 性能的原因與它列出文件的方式有關(我想是 LIFO 而不是 FIFO)。現在,問題是,我還需要以有效的方式移動大量文件。經過一番搜尋,我發現了這個:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination
雖然這會刪除 中的所有移動文件,
~/source
但目錄仍保留在那裡。由於我有一個類似“循環”的目錄結構,其數量files/directories
非常接近 1,所以我不得不再次執行第一個命令以完全擺脫該目錄:rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \ rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
直線
mv
幾乎會立即完成,但我的~/destination
目錄有應該保留的文件,所以mv
不是一個選項。我找到了--prune-empty-dirs
and--force
rsync 選項,但似乎都沒有像我預期的那樣工作:--force force deletion of directories even if not empty --prune-empty-dirs prune empty directory chains from the file-list --remove-source-files sender removes synchronized files (non-dirs)
有沒有辦法一次性模仿 rsync的動作?
我在stackoverflow上找到了這個主題,標題為:使用rsync“移動”刪除文件夾?,這基本上是在問同樣的問題。答案之一建議執行
rsync
in 2 命令,因為似乎沒有一個命令可以完成文件和源目錄的移動/刪除。$ rsync -av --ignore-existing --remove-source-files source/ destination/ && \ rsync -av --delete `mktemp -d`/ source/ && rmdir source/
或者,您可以使用以下命令執行此操作:
$ rsync -axvvES --remove-source-files source_directory /destination/ && \ rm -rf source_directory
不理想,但可以完成工作。
從 zany 的評論到 slm 的答案(使用 rsync 移動文件和刪除目錄?)我會推薦這兩個命令作為答案:
rsync -av --ignore-existing --remove-source-files source/ destination/ && \ find source/ -depth -type d -empty -exec rmdir "{}" \;
優點是,就像 zany 說的那樣,如果您沒有正確使用 rm -rf 或者對於初學者,使用它仍然存在一些危險。
我添加了 2 個選項,-depth 和 -empty,雖然我不確定這是否真的有必要,但它使第二個命令在其他情況下更具可移植性,甚至更安全(如果某些目錄不為空,它仍然會做正確的事情並且開始從目錄樹的最深處刪除)