Это выведет список имен файлов без префикса:
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
выходные данные по умолчанию.