找到名称相似的文件

找到名称相似的文件

我正在运行 OS X 10.7.3。我想找到文件名中包含通用字符串的所有文件。

我有一个文件夹,其中包含几个文件,这些文件的文件名除了前缀外都相同。例如:

003 - 日食.mp3
008 - 美丽的一天.mp3
027 - 日食.mp3
103 - 连绵起伏的山丘.mp3
244 - 连绵起伏的山丘.mp3

从该列表中,我想过滤掉任何具有“完全独特”名称的实体,在本例中为:008 - Beautiful Day.mp3

是否有一个 GUI 客户端、一个自动程序脚本或者一个终端命令可以做到这一点?

多谢!

答案1

ls | cut -b 6- | sort | uniq -c | sort -r

这会剪切前缀并显示文件“重复”的次数

答案2

这将打印不带前缀的文件名列表:

awk -F ' - ' '{counts[$2]++; names[$0]} END {for (item in counts) {if (counts[item] > 1) {print item}}}' < <(printf '%s\n' *)

示例输出:

Solar Eclipse.mp3
Rolling Hills.mp3

要打印每个文件的完整文件名:

awk -F ' - ' '{counts[$2]++; names[$0]} END {for (name in names) {split(name, parts, / - /); if (counts[parts[2]] > 1) {print name}}}' < <(printf '%s\n' *)

示例输出:

027 - Solar Eclipse.mp3
003 - Solar Eclipse.mp3
244 - Rolling Hills.mp3
103 - Rolling Hills.mp3

输出中的文件顺序不保证是分组的(即使在这个简单的例子中是这样)。如果您有 GNU AWK(gawk),您可以对输出进行分组:

awk -F ' - ' '
    {
        counts[$2]++;
        names[++c] = $2 " - " $1
    }
    END {
        num = asort(names);
        for (i = 1; i <= num; i++) {
            split(names[i], indices, / - /)
            if (counts[indices[1]] > 1) {
                print indices[2] " - " indices[1]
            }
        }
    }
' < <(printf '%s\n' *)

如果你没有gawk,你可以使用sort

awk ... | sort -k3,3

除了printf使用进程替换,您还可以将其通过管道传输到 AWK 脚本中。或者,find如果您想以递归方式执行此操作,也可以在管道中使用或使用进程替换。如果您希望通过递归运行来全局比较文件名,则需要删除find默认输出的目录名称。

相关内容