найдите файлы с похожими именами

найдите файлы с похожими именами

Я использую 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выводятся по умолчанию.

Связанный контент