簡體   English   中英

在目錄中按名稱查找文件的重復項-Linux

[英]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}'

printawk的默認操作。 它打印整個當前行。 由於它是默認操作,因此可以省略。 也可以省略>1檢查,因為awk將大於零的整數值視為true 這給了我們最終的命令:

... | awk -F. 'a[$4]++' 

為了概括該命令,我們可以說感興趣的模式不是第四列,它是倒數第二列。 這可以用awkNF 的字段數表示:

... | 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM