我正在运行 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
默认输出的目录名称。