gpt4 book ai didi

regex - 递归地在目录中按名称查找文件的重复项 - Linux

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:59:46 26 4
gpt4 key购买 nike

我有一个文件夹,其中包含子文件夹和其中的一些文件。

文件的命名方式如下

abc.DEF.xxxxxx.dat

我试图在上述模式中找到仅匹配“xxxxxx”的重复文件,而忽略其余部分。扩展名 .dat 不变。但是 abc 和 DEF 的长度可能会改变。按句点分隔的顺序也没有改变。

我猜我需要使用 Find通过以下方式

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]++' 

为了概括命令,我们可以说感兴趣的模式不是第 4 列,而是倒数第二列。这可以使用 awk 中的 number of fields 及其 NF 来表示:

... | awk -F. 'a[$(NF-1)]++'

输出:

./abc.DEF.xxxxxx.dat
./abd.DdF.xxxxxx.dat
./abd.DEF.xxxxxx.dat

关于regex - 递归地在目录中按名称查找文件的重复项 - Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21505439/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com