Linux

根據文件名的前幾個字元查找重複文件

  • December 19, 2020

我正在尋找一種在 Linux shell 中的方法,最好是 bash 根據文件名的前幾個字母來查找文件的重複項。

這將是有用的:

我為 Minecraft 建構模組包。從 1.14.4 開始,如果一組更高版本中存在重複的 mod,則 Forge 不再出錯。它只是停止執行最舊的版本。幫助查找這些重複項的腳本將非常有利。

範例清單:

minecolonies-0.13.312-beta-universal.jar   
minecolonies-0.13.386-alpha-universal.jar 

通過快速辨識受騙者,我可以使客戶包保持較小。

根據要求提供更多資訊

沒有具體的格式。但是,正如您所見,至少有兩種流行的格式。此外,社區中沒有關於使用或不使用哪種字元的標準。有些使用空格(ick),有些使用

$$ $$(也 ick),有些使用 _(更多 ick),有些使用 -(首選,但你能做什麼)。 https://gist.github.com/be3cc9a77150194476b2000cb8ee16e5獲取文件名的範例 mods 列表。已經清理乾淨了,所以里面沒有騙子。

https://gist.github.com/b0ac1e03145e893e880da45cf08ebd7a包含我故意複製的範例。這是對不時發生的事情的過度誇大。

更深層次的解釋

我意識到這可能會佔用大量資源。

我想任意指定要採樣的所有文件名的切片範圍開始到結束。根據該切片查找重複項,然後突出顯示重複項。我不需要腳本來實際刪除它們。

額外學分

該腳本會為它懷疑與複製標準匹配的文件提供一個菜單,以便輕鬆刪除或重命名。

過濾可能的重複項

您可以使用一些腳本來過濾這些文件以查找可能的重複項。您可以將所有與至少另一個匹配的文件移動到一個新目錄,不區分大小寫,在其名稱中第一個破折號、下劃線或空格之前的部分。cd進入你的 jars 目錄來執行它。

#!/bin/bash
mkdir -p possible_dups

awk -F'[-_ ]' '
   NR==FNR {seen[tolower($1)]++; next}
   seen[tolower($1)] > 1
' <(printf "%s\n" *.jar) <(printf "%s\n" *.jar) |\
   xargs -r -d'\n' mv -t possible_dups/ --

注意:-r是一個 GNU 擴展,以避免mv在找不到可能的重複項時在沒有文件參數的情況下執行一次。GNU 參數也-d'\n'用換行符分隔文件名,這意味著空格和其他常用字元在上述命令中處理,但不處理換行符。

您可以編輯欄位分隔符分配,-F'[-_ ]'添加或刪除字元以定義我們測試重複部分的結尾。現在它的意思是“破折號或取消劃線或空格”。擷取比真正的重複案例更多的東西通常是件好事,就像我在這裡可能做的那樣。

現在您可以檢查這些文件。如果您覺得它們的數量不是很大,您也可以直接對所有文件進行下一步,無需過濾。


目視檢查可能的重複

我建議您為此任務使用可視外殼,例如mcMidnight Commandermc您可以使用 linux 發行版的包管理工具輕鬆安裝。

你呼叫mc到你有這些文件的目錄,或者你可以在那裡導航。使用 X 終端,您也可以獲得滑鼠支持,但任何東西都有方便的快捷方式。

例如,按照菜單Left -> Sorting... -> untick "case sensitive"將為您提供所需的排序視圖。

使用箭頭瀏覽文件,您可以選擇其中的許多文件,Insert然後您可以複製 ( F5)、移動 ( F6) 或刪除 ( F8) 突出顯示的選擇。這是過濾後的測試數據的螢幕截圖:

在此處輸入圖像描述

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