Найдите файлы с одинаковыми именами
Я использую OS X 10.7.3. Я хотел бы найти все файлы, которые имеют общие строки в именах файлов.
У меня есть папка, которая содержит несколько файлов с одинаковыми именами файлов, за исключением префикса. Например:
003 - Солнечное затмение.mp3
008 - Прекрасный день.mp3
027 - Солнечное затмение.mp3
103 - Rolling Hills.mp3
244 - Rolling Hills.mp3
Из этого списка я хотел бы отфильтровать любые сущности с "полностью уникальными" именами, в данном случае: 008 - Beautiful Day.mp3
Есть клиент GUI, скрипт automator или команда терминала, которая сделает это?
Большое спасибо!
2 ответа
ls | cut -b 6- | sort | uniq -c | sort -r
это обрезает префиксы и показывает, сколько раз файл "дублируется"
Это выведет список имен файлов без префикса:
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
выводит по умолчанию.