1

Я использую 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 ответа2

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

это обрезает префиксы и показывает, сколько раз файл "дублируется"

0

Это выведет список имен файлов без префикса:

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 выходные данные по умолчанию.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .