Linux下如何刪除所有子目錄下的所有文件,同時保留每個子目錄下最大的文件?

Linux下如何刪除所有子目錄下的所有文件,同時保留每個子目錄下最大的文件?

這是我的第一個問題,感謝您允許我提問並閱讀我的問題!

我在 Ubuntu 22.04 w 下。 GNOME Shell 和 bash shell。我有一個包含 800 多個子目錄的資料夾。每個子目錄包含同一影片的 4 到 8 個不同解析度的版本。對於每個視訊/子目錄,我只想保留最佳解析度。

如何遞歸刪除所有子目錄中的所有文件,只保留每個子目錄中最大的文件?

答案1

抱歉,我不會為您編寫腳本,但這是一種可以使用的演算法。 (雖然以下內容使用腳本元素,但它遠非準確的腳本,僅僅嘗試插入命令可能會造成災難性的後果)

在執行任何操作之前,我強烈建議將整個目錄結構複製到另一個磁碟,您可以在執行腳本之前測試腳本並意外刪除無法恢復的文件

  1. 從頂部目錄開始,fldrLst='find ./ -type d'(我使用單引號表示左刻度線)
  2. 從頂層目錄開始,循環$fldrLst執行以下操作
    • 從單一目錄葉中按檔案大小降序取得檔案清單:fileLst='find $fldrList[n] -type f -maxdepth 1 -exec ls -al {} \; | sort k 5 -nr'其中[n]是清單陣列的特定成員。
    • 計算目錄葉中的檔案數:echo $fildLst | wc -l
    • 刪除第一個條目(應該是最大的檔案)之後的每個檔案:循環$fileLst並刪除rm $fileList[n](其中第一個條目n是數組中的第二個條目)。

這應該會讓您走上完成任務的正確軌道。


如果此答案有助於幫助您找到解決方案,請務必將其標記為答案或將其投票為部分解決方案。

答案2

linux - 刪除除最大文件之外的所有文件

測試版本,它只會刪除要刪除的 ls 檔案:

find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r ls -l

工作版本,它將刪除您的檔案:

find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r rm

原始碼由卡米爾·馬喬羅夫斯基

相關內容