我有一个文件夹,其中包含子文件夹和更多文件。
文件按以下方式命名
abc.DEF.xxxxxx.dat
我正在尝试在上述模式中找到仅匹配'xxxxxx'的重复文件而忽略其余文件。扩展名.dat不会更改。但是abc和DEF的长度可能会改变。按期间分隔的顺序也不会改变。
我猜我需要以下列方式使用Find
find -regextype posix-extended -regex '\w+\.\w+\.\w+\.dat'
我需要帮助提出正则表达式。感谢。
实施例: 对于名为'epg.ktt.crwqdd.dat'的文件,我需要找到包含'crwqdd'的重复文件。
答案 0 :(得分:1)
您可以使用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]++'
为了概括命令我们可以说感兴趣的模式不是第4列,它是最后一列的下一列。这可以使用awk
NF
中的字段数表示:
... | awk -F. 'a[$(NF-1)]++'
输出:
./abc.DEF.xxxxxx.dat
./abd.DdF.xxxxxx.dat
./abd.DEF.xxxxxx.dat