Rm
加快多個目錄的隨機排序和刪除(rm)
在本質上是 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
雖然它確實有效,但我希望它遞歸地為子目錄執行此操作,因此我不必為每個目錄手動執行此操作。所以我的問題/要求是:
- 我可以以某種方式優化它以加快速度嗎?
- 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