用 fdupes 刪除重複檔案時,如果有 a、b、c 三個目錄,並且希望優先保留 a,其次保留 b,最後刪除 c 中的重複檔案,關鍵不在於寫一個複雜規則,而在於目錄輸入順序。
fdupes 在非互動刪除模式下,會保留每組重複檔案中最先出現的檔案,刪除後續發現的重複項。因此目錄參數要按「保留優先級從高到低」排列。
也就是說,想實現「先刪 c,再刪 b,最後盡量保留 a」,命令應該寫成:
|
|
掃描順序是 a -> b -> c。當三個目錄中存在相同檔案時,a 裡的檔案會先被發現並保留,b 和 c 中重複的檔案會被刪除。如果只有 b 和 c 有重複檔案,則保留 b,刪除 c。
參數含義
常用參數如下:
-r:遞迴掃描子目錄。-d:刪除重複檔案。-N:與-d配合使用,不進入互動確認,自動保留每組重複檔案中的第一個,刪除其餘檔案。
因此,自動刪除重複檔案的基本格式是:
|
|
目錄越靠前,保留優先級越高;目錄越靠後,越容易被刪除。
先預覽再刪除
直接使用 -dN 會刪除檔案,建議先預覽重複檔案分組:
|
|
輸出結果會按重複檔案分組展示。每組中靠前的檔案,就是非互動刪除時更可能被保留的檔案。
也可以查看統計資訊:
|
|
如果資料重要,建議先把結果保存下來人工檢查:
|
|
確認每組重複檔案的排列順序符合預期後,再執行:
|
|
子目錄怎麼處理
只要開啟 -r,fdupes 會遞迴掃描傳入目錄下的所有檔案。決定保留優先級的,仍然是命令中路徑出現的先後順序。
例如:
|
|
這表示:
dir_a的優先級最高。dir_b次之。dir_c最低。
如果 dir_a/sub1/file.txt 和 dir_c/sub1/file.txt 內容相同,會保留 dir_a 下的檔案。如果 dir_a/x/y/file.txt 和 dir_c/file.txt 內容相同,也會優先保留 dir_a 下的檔案。fdupes 比較的是檔案內容,不要求檔名或目錄層級完全一致。
精確控制子目錄優先級
如果只傳父目錄,子目錄內部的掃描順序由 fdupes 的遍歷邏輯決定。多數情況下,這已經夠用。但如果你想讓某個子目錄擁有更高優先級,就要把它顯式寫在前面。
例如,希望優先保留 dir_a,然後保留 dir_b/special,再處理 dir_b 的其他內容,最後處理 dir_c:
|
|
這樣 dir_b/special 會先於 dir_b 被掃描。之後掃描 dir_b 時,special 裡的檔案已經被記錄,整體優先級就會高於 dir_b 的其他部分。
這個寫法適合下面這種需求:
a是最重要的基準目錄。b中某個子目錄比b的其他內容更重要。c主要作為低優先級備份目錄。
路徑順序可以繼續擴展:
|
|
規則仍然只有一個:越靠前,越優先保留。
目錄很多時使用列表
如果有很多目錄和子目錄,手動寫一長串命令容易出錯。可以把路徑按優先級寫入一個文字檔,比如 folders.txt:
|
|
然後用 xargs 傳給 fdupes:
|
|
如果路徑中可能包含空格,更穩妥的方式是使用空字元分隔:
|
|
需要注意的邊界
第一,fdupes 比較的是檔案內容,而不是檔名。如果兩個檔名完全不同,但內容一致,也會被識別為重複檔案。
第二,如果 a 目錄內部本身就有重複檔案,使用 fdupes -rdN a b c 時,a 內部靠後的重複項也可能被刪除。這個命令表達的是「按整體掃描順序保留最先出現的檔案」,不是「絕對不刪除 a 中任何檔案」。
第三,預設情況下,fdupes 不會跟隨符號連結。如果需要處理軟連結相關檔案,要先確認是否需要加 -s,以及這樣做是否符合你的資料安全預期。
第四,fdupes 只刪除重複檔案,不負責清理空目錄。刪除完成後,如果 b、c 中留下了空資料夾,可以再執行:
|
|
更安全的操作習慣
如果目錄裡是重要資料,不建議一上來就執行 -rdN。更穩的流程是:
- 先執行
fdupes -r a b c查看重複分組。 - 確認每組中排在前面的檔案確實應該保留。
- 再執行
fdupes -rdN a b c自動刪除。 - 刪除後檢查是否需要清理空目錄。
如果你非常擔心誤刪 a 中的檔案,可以先只對低優先級目錄做更小範圍的清理,或者把結果匯出後人工篩選。fdupes 的目錄順序很好用,但它不是權限隔離規則;只要路徑被納入掃描,路徑內部的重複檔案就可能參與刪除判斷。
小結
用 fdupes 按優先級刪除重複檔案,核心就是把「想保留的目錄」放在前面,把「優先刪除的目錄」放在後面。
想保留 a,再保留 b,優先刪除 c:
|
|
想讓某個子目錄優先級更高,就把它單獨寫在父目錄前面:
|
|
記住一句話就夠了:fdupes -dN 會保留先出現的重複檔案,刪除後出現的重複檔案。目錄順序,就是你的保留優先級。