fdupes 怎麼控制刪除順序?按目錄優先級保留重複檔案

說明如何用 fdupes 按目錄輸入順序控制重複檔案保留優先級,並處理 a、b、c 多目錄及子目錄場景。

fdupes 刪除重複檔案時,如果有 abc 三個目錄,並且希望優先保留 a,其次保留 b,最後刪除 c 中的重複檔案,關鍵不在於寫一個複雜規則,而在於目錄輸入順序。

fdupes 在非互動刪除模式下,會保留每組重複檔案中最先出現的檔案,刪除後續發現的重複項。因此目錄參數要按「保留優先級從高到低」排列。

也就是說,想實現「先刪 c,再刪 b,最後盡量保留 a」,命令應該寫成:

1
fdupes -rdN a b c

掃描順序是 a -> b -> c。當三個目錄中存在相同檔案時,a 裡的檔案會先被發現並保留,bc 中重複的檔案會被刪除。如果只有 bc 有重複檔案,則保留 b,刪除 c

參數含義

常用參數如下:

  • -r:遞迴掃描子目錄。
  • -d:刪除重複檔案。
  • -N:與 -d 配合使用,不進入互動確認,自動保留每組重複檔案中的第一個,刪除其餘檔案。

因此,自動刪除重複檔案的基本格式是:

1
fdupes -rdN 目录A 目录B 目录C

目錄越靠前,保留優先級越高;目錄越靠後,越容易被刪除。

先預覽再刪除

直接使用 -dN 會刪除檔案,建議先預覽重複檔案分組:

1
fdupes -r a b c

輸出結果會按重複檔案分組展示。每組中靠前的檔案,就是非互動刪除時更可能被保留的檔案。

也可以查看統計資訊:

1
fdupes -rm a b c

如果資料重要,建議先把結果保存下來人工檢查:

1
fdupes -r a b c > duplicates.txt

確認每組重複檔案的排列順序符合預期後,再執行:

1
fdupes -rdN a b c

子目錄怎麼處理

只要開啟 -rfdupes 會遞迴掃描傳入目錄下的所有檔案。決定保留優先級的,仍然是命令中路徑出現的先後順序。

例如:

1
fdupes -rdN dir_a dir_b dir_c

這表示:

  • dir_a 的優先級最高。
  • dir_b 次之。
  • dir_c 最低。

如果 dir_a/sub1/file.txtdir_c/sub1/file.txt 內容相同,會保留 dir_a 下的檔案。如果 dir_a/x/y/file.txtdir_c/file.txt 內容相同,也會優先保留 dir_a 下的檔案。fdupes 比較的是檔案內容,不要求檔名或目錄層級完全一致。

精確控制子目錄優先級

如果只傳父目錄,子目錄內部的掃描順序由 fdupes 的遍歷邏輯決定。多數情況下,這已經夠用。但如果你想讓某個子目錄擁有更高優先級,就要把它顯式寫在前面。

例如,希望優先保留 dir_a,然後保留 dir_b/special,再處理 dir_b 的其他內容,最後處理 dir_c

1
fdupes -rdN dir_a dir_b/special dir_b dir_c

這樣 dir_b/special 會先於 dir_b 被掃描。之後掃描 dir_b 時,special 裡的檔案已經被記錄,整體優先級就會高於 dir_b 的其他部分。

這個寫法適合下面這種需求:

  • a 是最重要的基準目錄。
  • b 中某個子目錄比 b 的其他內容更重要。
  • c 主要作為低優先級備份目錄。

路徑順序可以繼續擴展:

1
fdupes -rdN a b/important b c/keep-first c

規則仍然只有一個:越靠前,越優先保留。

目錄很多時使用列表

如果有很多目錄和子目錄,手動寫一長串命令容易出錯。可以把路徑按優先級寫入一個文字檔,比如 folders.txt

1
2
3
4
5
/path/to/dir_a
/path/to/dir_b/sub_important
/path/to/dir_b
/path/to/dir_c/sub_1
/path/to/dir_c

然後用 xargs 傳給 fdupes

1
cat folders.txt | xargs fdupes -rdN

如果路徑中可能包含空格,更穩妥的方式是使用空字元分隔:

1
tr '\n' '\0' < folders.txt | xargs -0 fdupes -rdN

需要注意的邊界

第一,fdupes 比較的是檔案內容,而不是檔名。如果兩個檔名完全不同,但內容一致,也會被識別為重複檔案。

第二,如果 a 目錄內部本身就有重複檔案,使用 fdupes -rdN a b c 時,a 內部靠後的重複項也可能被刪除。這個命令表達的是「按整體掃描順序保留最先出現的檔案」,不是「絕對不刪除 a 中任何檔案」。

第三,預設情況下,fdupes 不會跟隨符號連結。如果需要處理軟連結相關檔案,要先確認是否需要加 -s,以及這樣做是否符合你的資料安全預期。

第四,fdupes 只刪除重複檔案,不負責清理空目錄。刪除完成後,如果 bc 中留下了空資料夾,可以再執行:

1
find b c -type d -empty -delete

更安全的操作習慣

如果目錄裡是重要資料,不建議一上來就執行 -rdN。更穩的流程是:

  1. 先執行 fdupes -r a b c 查看重複分組。
  2. 確認每組中排在前面的檔案確實應該保留。
  3. 再執行 fdupes -rdN a b c 自動刪除。
  4. 刪除後檢查是否需要清理空目錄。

如果你非常擔心誤刪 a 中的檔案,可以先只對低優先級目錄做更小範圍的清理,或者把結果匯出後人工篩選。fdupes 的目錄順序很好用,但它不是權限隔離規則;只要路徑被納入掃描,路徑內部的重複檔案就可能參與刪除判斷。

小結

fdupes 按優先級刪除重複檔案,核心就是把「想保留的目錄」放在前面,把「優先刪除的目錄」放在後面。

想保留 a,再保留 b,優先刪除 c

1
fdupes -rdN a b c

想讓某個子目錄優先級更高,就把它單獨寫在父目錄前面:

1
fdupes -rdN a b/important b c

記住一句話就夠了:fdupes -dN 會保留先出現的重複檔案,刪除後出現的重複檔案。目錄順序,就是你的保留優先級。

记录并分享
使用 Hugo 建立
主題 StackJimmy 設計