Rm

加快多個目錄的隨機排序和刪除(rm)

  • June 1, 2019

在本質上是 BSD 的終端中執行 MacOS,因此在這裡發布我的問題而不是詢問不同的問題。我想在後續步驟中通過隨機刪除文件來修剪我的圖像數據集。一些目錄有超過 100 萬張 jpg。我的數據位於主目錄中,子目錄的 maxdepth 僅為 1:

-master
    -data1
      image.jpgs
    -data2
      image.jpgs
    -data3
      image.jpgs
    -data4
      image.jpgs
... and so forth

我找到了這個連結:

https://superuser.com/questions/1186350/delete-all-but-1000-random-files-in-a-directory

…並想出了:

for f in *.jpg; do find "$f" -type f -print0 | sort -R | tail -n +50001 | xargs -0 rm; done

雖然它確實有效,但我希望它遞歸地為子目錄執行此操作,因此我不必為每個目錄手動執行此操作。所以我的問題/要求是:

  1. 我可以以某種方式優化它以加快速度嗎?
  2. sort/tail 在遇到少於 50,000 個文件的目錄時會返回錯誤嗎?

檢查連結的源文章後,看起來您的循環實際上應該是:

for d in */; do find "$d" -iname '*.jpg' -type f -print0 | sort -zR | tail -zn +50001 | xargs -0r rm; done

master目錄執行。

和的-z選項是必要的,因為輸入是空分隔的。如果少於 50000 行,兩者都不會抱怨 -不在乎並且不會輸出任何內容,因為在第 50000 行之後沒有任何內容。可能會抱怨在沒有參數的情況下執行,但是如果沒有輸入,GNU 的選項會阻止它執行(BSD xargs 不需要它,但可能不會抱怨)。sort``tail``sort``tail``rm``-r``xargs``rm

最後,但最重要的-z是,BSD tail 可能不支持空分隔輸入的選項。你需要 GNU tail,它可以使用 homebrew 安裝。

如果您的文件名保證沒有空格、換行符、引號、反斜杠等,您可能可以不使用以空分隔的行。在這種情況下:

for d in */; do find "$d" -type f | sort -R | tail -n +50001 | xargs rm; done

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