
這是我的第一個問題,感謝您允許我提問並閱讀我的問題!
我在 Ubuntu 22.04 w 下。 GNOME Shell 和 bash shell。我有一個包含 800 多個子目錄的資料夾。每個子目錄包含同一影片的 4 到 8 個不同解析度的版本。對於每個視訊/子目錄,我只想保留最佳解析度。
如何遞歸刪除所有子目錄中的所有文件,只保留每個子目錄中最大的文件?
答案1
抱歉,我不會為您編寫腳本,但這是一種可以使用的演算法。 (雖然以下內容使用腳本元素,但它遠非準確的腳本,僅僅嘗試插入命令可能會造成災難性的後果)
在執行任何操作之前,我強烈建議將整個目錄結構複製到另一個磁碟,您可以在執行腳本之前測試腳本並意外刪除無法恢復的文件
- 從頂部目錄開始,
fldrLst='find ./ -type d'
(我使用單引號表示左刻度線) - 從頂層目錄開始,循環
$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
測試版本,它只會刪除要刪除的 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
原始碼由卡米爾·馬喬羅夫斯基