【问题标题】:Find duplicates of a file by name in a directory recursively - Linux递归地在目录中按名称查找文件的重复项 - Linux
【发布时间】:2014-02-02 00:13:43
【问题描述】:

我有一个文件夹,其中包含子文件夹和更多文件。

文件按以下方式命名

abc.DEF.xxxxxx.dat

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

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

find -regextype posix-extended -regex '\w+\.\w+\.\w+\.dat'

我需要有关正则表达式的帮助。谢谢。

示例: 对于名为“epg.ktt.crwqdd.dat”的文件,我需要找到包含“crwqdd”的重复文件。

【问题讨论】:

  • 你试过find -type f -iname 'abc.DEF.*.dat'吗?
  • @hek2mgl 抱歉在这方面不够明确。 'abc' 和 'DEF' 值/长度发生变化。所以可以有一个像'epg.ktt.crwqdd.dat'这样的文件。在此示例中,我需要找到“crwqdd”的重复项。谢谢。
  • 还有find -type f -iname '*.*.crwqdd.dat'?
  • @hek2mgl 这仅适用于查找 crwqdd 的重复项。但是可能存在包含不同字符串的文件名,而不是可以匹配的 crwqdd。所以我别无选择,只能使用正则表达式。

标签: regex linux shell find duplicates


【解决方案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}'

printawk 中的默认操作。它打印整个当前行。由于它是默认操作,因此可以省略。此外,>1 检查可以省略,因为awk 将大于零的整数值视为true。这给了我们最终的命令:

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

为了概括命令,我们可以说感兴趣的模式不是第 4 列,而是倒数第二列。这可以使用awkNF 中的字段数 表示:

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

输出:

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

【讨论】:

  • 谢谢!我对其进行了测试,这是输出s28.postimg.org/n146n1nil/Capture.png 它似乎不包括应该匹配的最后一个文件'cdd.DxdsdF.xxxxxx.dat'。你能解释一下上面的命令是如何工作的吗?这样我就可以解决问题。再次感谢!
  • 检查我的更新。您需要计算 $4 - 第四列 - 而不是第三列。那是因为第一列是空的。
  • 感谢 hek2mgl 花时间清楚地解释它。非常感谢!
  • 不,问题 :) 有趣的问题,解决起来很有趣。
  • 这是一种很棒的态度!!另外,如何调整/修改“if”语句以获得以下结果:查找 a[$4] 的重复项,但排除具有相同 a[$2] 的那些文件?再次感谢!
猜你喜欢
  • 2017-01-21
  • 2013-04-22
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2013-10-10
  • 2014-03-07
  • 2012-03-12
相关资源
最近更新 更多