[英]Find duplicates of a file by name in a directory recursively - Linux
我有一個包含子文件夾和其中更多文件的文件夾。
這些文件以以下方式命名
abc.DEF.xxxxxx.dat
我試圖在上述模式中查找僅與“ xxxxxx”匹配的重復文件,而忽略其余文件。 擴展名.dat不變。 但是abc和DEF的長度可能會改變。 按句點分隔的順序也不會更改。
我猜我需要以以下方式使用查找
find -regextype posix-extended -regex '\w+\.\w+\.\w+\.dat'
我需要有關正則表達式的幫助。 謝謝。
示例:對於名為“ epg.ktt.crwqdd.dat”的文件,我需要查找包含“ crwqdd”的重復文件。
您可以使用awk
:
find /path -type f -name '*.dat' | awk -F. 'a[$4]++'
說明:
讓我們find
以下輸出:
./abd.DdF.TTDFDF.dat
./cdd.DxdsdF.xxxxxx.dat
./abc.DEF.xxxxxx.dat
./abd.DdF.xxxxxx.dat
./abd.DEF.xxxxxx.dat
基本上,用計算機的語言來說,您希望計算.dat
和下一個點之間的圖案出現次數,並打印出至少第二次出現圖案的行。
為此,我們用。分割文件名.
是什么賦予我們5(!)個字段:
echo ./abd.DEF.xxxxxx.dat | awk -F. '{print $1 " " $2 " " $3 " " $4 " " $5}'
/abd DEF xxxxxx dat
請注意第一個空白字段。 利息模式為$4
。
要計算$4
中某個模式的出現次數,我們使用一個關聯數組a
並在每次出現時增加其值。 未經優化, awk
命令將如下所示:
... | awk -F. '{{if(a[$4]++ > 1){print}}'
但是,您可以使用以下形式編寫awk
程序:
CONDITION { ACTION }
什么會給我們:
... | awk -F. 'a[$4]++ > 1 {print}'
print
是awk
的默認操作。 它打印整個當前行。 由於它是默認操作,因此可以省略。 也可以省略>1
檢查,因為awk
將大於零的整數值視為true
。 這給了我們最終的命令:
... | awk -F. 'a[$4]++'
為了概括該命令,我們可以說感興趣的模式不是第四列,它是倒數第二列。 這可以用awk
的NF
的字段數表示:
... | awk -F. 'a[$(NF-1)]++'
輸出:
./abc.DEF.xxxxxx.dat
./abd.DdF.xxxxxx.dat
./abd.DEF.xxxxxx.dat
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.