Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在目录中按名称递归查找重复的文件-Linux_Regex_Linux_Shell_Find_Duplicates - Fatal编程技术网

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

Regex 在目录中按名称递归查找重复的文件-Linux,regex,linux,shell,find,duplicates,Regex,Linux,Shell,Find,Duplicates,我有一个文件夹,其中包含子文件夹和一些其他文件 这些文件的命名方式如下 abc.DEF.xxxxxx.dat 我试图在上面的模式中找到只与“xxxxxx”匹配的重复文件,忽略其余的。扩展名.dat不变。但是abc和DEF的长度可能会改变。按时段划分的顺序也不会改变 我猜我需要用下面的方法 find -regextype posix-extended -regex '\w+\.\w+\.\w+\.dat' 我需要你帮我找到正则表达式。谢谢 例如: 对于名为“epg.ktt.crwqdd.dat

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

这些文件的命名方式如下

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个(!)字段:

请注意第一个空字段。感兴趣的模式是
$4

为了计算模式在
$4
中的出现次数,我们使用关联数组
a
,并在每次出现时增加其值。未优化,
awk
命令如下所示:

... | awk -F. '{{if(a[$4]++ > 1){print}}'
但是,您可以按照以下格式编写
awk
程序:

CONDITION { ACTION }
我们将得到什么:

... | awk -F. 'a[$4]++ > 1 {print}'
print
awk
中的默认操作。它会打印整个当前行。因为这是默认操作,所以可以忽略它。由于
awk
将大于零的整数值视为
真值,因此可以省略
>1
检查。这给了我们最后的命令:

... | awk -F. 'a[$4]++' 
为了概括这个命令,我们可以说感兴趣的模式不是第4列,而是倒数第二列。这可以使用
awk
its
NF
中的字段数表示:

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

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

您是否尝试过
find-typef-iname'abc.DEF.*.dat'
?@hek2mgl很抱歉在这方面不够清晰abc'和DEF'值/长度发生变化。因此可以有一个类似“epg.ktt.crwqdd.dat”的文件。在本例中,我需要找到“crwqdd”的副本。谢谢。还有
find-typef-iname'*.*.crwqdd.dat'
?@hek2mgl,它只用于查找crwqdd的副本。但可能存在包含不同字符串的文件名,而不是可以匹配的crwqdd。所以我别无选择,只能使用正则表达式。谢谢!我对它进行了测试,这是输出,它似乎不包括应该匹配的最后一个文件“cdd.DxdsdF.xxxxxx.dat”。你能解释一下上面的命令是如何工作的吗?这样我才能解决问题。再次感谢!检查我的更新。你需要数4美元——第四列——而不是第三列。这是因为第一列将是空的。感谢hek2mgl花时间清楚地解释它。非常感谢!!不,问题:)有趣的问题,解决起来很有趣。这是一种很棒的态度!!另外,如何调整/修改“if”语句以获得以下结果:查找[$4]的重复项,但排除具有相同a[$2]的文件?再次感谢!
./abc.DEF.xxxxxx.dat
./abd.DdF.xxxxxx.dat
./abd.DEF.xxxxxx.dat