Fedora

查找具有相同文件名和完全相同大小的重複文件

  • November 24, 2021

我有一個巨大的歌曲文件夾,結構凌亂,文件在多個文件夾中重複。

我需要一個工具或腳本的推薦,它可以通過簡單的兩個匹配項來查找和刪除重複項:

  1. 完全相同的文件名
  2. 完全相同的文件大小

在這種情況下,song.mp3文件大小為 1234 字節,儲存在/songs/album1和中/songs/albumz。工具/腳本應該只保留一份副本。

我在 Fedora 上嘗試過czkawka,但它可以通過文件名或文件大小進行搜尋,但不能將兩者結合在一起。

你真的不需要為此使用外部實用程序。您可以通過連結一組標準命令來走很遠的路,您可以通過將它們儲存在 shell 腳本或函式中來始終記住這些命令。

要檢測重複項,您可以將所有文件路徑儲存在關聯數組中,以大小加文件名為鍵。但是因為你表明你有一個大的文件集合,我建議你去排序。然後使用唯一選項再次排序,以便比較兩個結果為您提供重複項。

  1. 您想使用第一次排序的輸出兩次。我可以為此使用一個臨時文件;命名管道和fifos等對於這個簡單的工作不需要更少的工作。該命令將為您在目錄中mktemp列印一個安全唯一的文件名。/tmp/使用命令替換構造$(...),您可以將該名稱分配給一個名為tmp或其他的變數。回顯它以了解您在做什麼。
  2. 現在您要使用 2 個關鍵欄位:大小和文件名,並且還需要完整路徑。斜杠/不是有效的文件名字元是一種方便:它保留用於分隔目錄名和文件名。因此,您可以將/用作這 3 個欄位之間的分隔符。該命令的-printf動作find可以告訴你:找到所有的-type f(ile),並列印它們的大小%s、文件名%f和完整路徑%p,全部用.分隔/。完整路徑將包含更多斜杠,但我們知道只有前 2 個斜杠分隔符,即我們在-printf格式中明確指定的那些,是我們的。
  3. |將命令的輸出、find大小列表、文件名和完整路徑通過管道傳輸到sort命令。告訴它這些欄位由我們的斜杠分隔:-t /,並且鍵在前 2 個欄位中:-k 1,2。您可以將排序列表立即儲存在臨時文件中,但我選擇讓tee命令執行此操作,因為這樣您可以保持一個管道打開,以獲得更好的性能。
  4. |將排序後的列表通過管道傳輸到tee,它將其副本儲存到給定的文件名"$tmp",並將管道回顯到下一個管道。
  5. Pipe| tee將排序列表的回顯到 second sort,在相同的鍵上,但現在輸出-u--unique在排序鍵中。
  6. |將唯一大小+文件名條目列表作為第一個輸入 ( stdin ) 傳遞給命令,diff在第二個輸入時使用臨時文件。通常會在其輸出中添加一些標記,以便您可以辨識更改的性質。但我們不需要它,它會使我們需要的輸出變得混亂。我們知道唯一列表的每個條目也在完整列表中。我們只想要完整列表中的簡單額外行。這就是命令的選項所要求的。-``"$tmp"``diff``diff
  7. 到這裡的命令將輸出一個有希望的有重複文件的簡短列表。每組重複項中的一個被省略,因為它仍然存在於唯一列表中。為了處理該列表的每個條目,並對其最後一部分(完整路徑名)採取行動,我們|將其通過管道傳輸到一個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"
  1. 整理你身後,清理臨時文件"$tmp"

rdfind可以做你想做的事,但你需要依賴加密雜湊/校驗和(md5、sha1 或 sha256)來代替文件大小。

雜湊是比文件大小更嚴格的標準,但這可能是也可能不是您想要的。例如,考慮一個音樂文件中的所有元數據:如果一個文件被列為Schubert作曲家,而另一個潛在的重複文件被列為Bruckner作曲家,並且文件中的所有其他內容完全相同,則文件大小過濾器會將其分類為匹配,但雜湊過濾器不會。雜湊過濾器將使用比文件大小過濾器更多的資源,但如果您只是偶爾過濾重複項,這可能不是問題。

在您實際執行之前rdfind,請務必man rdfind仔細閱讀並使用該-dryrun選項,直到您確信結果是您想要的。

FWIW、本教程列出了rdfind和其他 3 個用於查找重複文件的實用程序。

我不知道過濾文件大小的工具,但如果我從頭開始創建一個,我想我會使用findand拼湊一些東西awk。讓我們知道這是否是您想要的 - 我認為這不是非常困難,但如果rdfind滿足您的需求並沒有多大意義。

引用自:https://unix.stackexchange.com/questions/678461