Я использую OS X 10.7.3. Я хотел бы найти все файлы, в именах которых есть общие строки.
У меня есть папка, содержащая несколько файлов, имена которых одинаковы, за исключением префикса. Например:
003 - Солнечное затмение.mp3
008 - Прекрасный день.mp3
027 - Солнечное затмение.mp3
103 - Холмы.mp3
244 - Холмы.mp3
Из этого списка я хотел бы отфильтровать все сущности с «полностью уникальными» именами, в данном случае: 008 - Beautiful Day.mp3
Существует ли графический клиент, скрипт-автоматизатор или терминальная команда, которые это сделают?
Большое спасибо!
решение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
выводятся по умолчанию.