查找具有相同文件名和完全相同大小的重複文件
我有一個巨大的歌曲文件夾,結構凌亂,文件在多個文件夾中重複。
我需要一個工具或腳本的推薦,它可以通過簡單的兩個匹配項來查找和刪除重複項:
- 完全相同的文件名
- 完全相同的文件大小
在這種情況下,
song.mp3
文件大小為 1234 字節,儲存在/songs/album1
和中/songs/albumz
。工具/腳本應該只保留一份副本。我在 Fedora 上嘗試過czkawka,但它可以通過文件名或文件大小進行搜尋,但不能將兩者結合在一起。
你真的不需要為此使用外部實用程序。您可以通過連結一組標準命令來走很遠的路,您可以通過將它們儲存在 shell 腳本或函式中來始終記住這些命令。
要檢測重複項,您可以將所有文件路徑儲存在關聯數組中,以大小加文件名為鍵。但是因為你表明你有一個大的文件集合,我建議你去排序。然後使用唯一選項再次排序,以便比較兩個結果為您提供重複項。
- 您想使用第一次排序的輸出兩次。我可以為此使用一個臨時文件;命名管道和fifos等對於這個簡單的工作不需要更少的工作。該命令將為您在目錄中
mktemp
列印一個安全唯一的文件名。/tmp/
使用命令替換構造$(...)
,您可以將該名稱分配給一個名為tmp
或其他的變數。回顯它以了解您在做什麼。- 現在您要使用 2 個關鍵欄位:大小和文件名,並且還需要完整路徑。斜杠
/
不是有效的文件名字元是一種方便:它保留用於分隔目錄名和文件名。因此,您可以將/
用作這 3 個欄位之間的分隔符。該命令的-printf
動作find
可以告訴你:找到所有的-type f
(ile),並列印它們的大小%s
、文件名%f
和完整路徑%p
,全部用.分隔/
。完整路徑將包含更多斜杠,但我們知道只有前 2 個斜杠分隔符,即我們在-printf
格式中明確指定的那些,是我們的。|
將命令的輸出、find
大小列表、文件名和完整路徑通過管道傳輸到sort
命令。告訴它這些欄位由我們的斜杠分隔:-t /
,並且鍵在前 2 個欄位中:-k 1,2
。您可以將排序列表立即儲存在臨時文件中,但我選擇讓tee
命令執行此操作,因為這樣您可以保持一個管道打開,以獲得更好的性能。|
將排序後的列表通過管道傳輸到tee
,它將其副本儲存到給定的文件名"$tmp"
,並將管道回顯到下一個管道。- Pipe
|
tee
將排序列表的回顯到 secondsort
,在相同的鍵上,但現在輸出-u
或--unique
在排序鍵中。|
將唯一大小+文件名條目列表作為第一個輸入 ( stdin ) 傳遞給命令,並diff
在第二個輸入時使用臨時文件。通常會在其輸出中添加一些標記,以便您可以辨識更改的性質。但我們不需要它,它會使我們需要的輸出變得混亂。我們知道唯一列表的每個條目也在完整列表中。我們只想要完整列表中的簡單額外行。這就是命令的選項所要求的。-``"$tmp"``diff``diff
- 到這裡的命令將輸出一個有希望的有重複文件的簡短列表。每組重複項中的一個被省略,因為它仍然存在於唯一列表中。為了處理該列表的每個條目,並對其最後一部分(完整路徑名)採取行動,我們
|
將其通過管道傳輸到一個while read
構造中。將每一行儲存在給定的參數名稱下dupl
。使用 bash 參數擴展語法#
,我們省略了前綴*/*/
,即大小加上帶有斜杠/
分隔符的文件名,剩下的是文件副本的完整路徑。我建議您先執行完整的命令echo
,然後在仔細檢查後用 remove 命令替換rm
它,或者更好的是,使用垃圾箱實用程序之一將重複項移動到 yuorTrash
,這樣你的目錄就被清理乾淨了,但什麼也沒有失去。tmp=$(mktemp) echo temp file is "$tmp" find -type f -printf "%s/%f/%p\n" | sort -t / -k 1,2 | tee "$tmp" | sort -t / -k 1,2 -u | diff --new-line-format="%L" --unchanged-line-format="" - "$tmp" | while read dupl;do echo "${dupl#*/*/}"; done rm "$tmp"
- 整理你身後,清理臨時文件
"$tmp"
。
rdfind
可以做你想做的事,但你需要依賴加密雜湊/校驗和(md5、sha1 或 sha256)來代替文件大小。雜湊是比文件大小更嚴格的標準,但這可能是也可能不是您想要的。例如,考慮一個音樂文件中的所有元數據:如果一個文件被列為
Schubert
作曲家,而另一個潛在的重複文件被列為Bruckner
作曲家,並且文件中的所有其他內容完全相同,則文件大小過濾器會將其分類為匹配,但雜湊過濾器不會。雜湊過濾器將使用比文件大小過濾器更多的資源,但如果您只是偶爾過濾重複項,這可能不是問題。在您實際執行之前
rdfind
,請務必man rdfind
仔細閱讀並使用該-dryrun
選項,直到您確信結果是您想要的。FWIW、本教程列出了
rdfind
和其他 3 個用於查找重複文件的實用程序。我不知道過濾文件大小的工具,但如果我從頭開始創建一個,我想我會使用
find
and拼湊一些東西awk
。讓我們知道這是否是您想要的 - 我認為這不是非常困難,但如果rdfind
滿足您的需求並沒有多大意義。