Bash

使用 rsync 移動文件和刪除目錄?

  • July 3, 2020

最近我需要刪除大量文件(超過 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-dirsand --forcersync 選項,但似乎都沒有像我預期的那樣工作:

--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“移動”刪除文件夾?,這基本上是在問同樣的問題。答案之一建議執行rsyncin 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,雖然我不確定這是否真的有必要,但它使第二個命令在其他情況下更具可移植性,甚至更安全(如果某些目錄不為空,它仍然會做正確的事情並且開始從目錄樹的最深處刪除)

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