localizar arquivos com nomes semelhantes

localizar arquivos com nomes semelhantes

Estou executando o OS X 10.7.3. Gostaria de localizar todos os arquivos que possuem strings comuns em seus nomes de arquivos.

Eu tenho uma pasta que contém vários arquivos cujos nomes são iguais, exceto o prefixo. Por exemplo:

003 - Eclipse Solar.mp3
008 - Lindo Dia.mp3
027 - Eclipse Solar.mp3
103 - Rolling Hills.mp3
244 - Rolling Hills.mp3

Dessa lista eu gostaria de filtrar quaisquer entidades com nomes "totalmente exclusivos", neste caso: 008 - Beautiful Day.mp3

Existe um cliente GUI, um script de automação ou um comando de terminal que fará isso?

Muito obrigado!

Responder1

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

isso corta os prefixos e mostra quantas vezes o arquivo é "duplicado"

Responder2

Isso imprimirá uma lista de nomes de arquivos sem o prefixo:

awk -F ' - ' '{counts[$2]++; names[$0]} END {for (item in counts) {if (counts[item] > 1) {print item}}}' < <(printf '%s\n' *)

Exemplo de saída:

Solar Eclipse.mp3
Rolling Hills.mp3

Para imprimir o nome completo de cada arquivo:

awk -F ' - ' '{counts[$2]++; names[$0]} END {for (name in names) {split(name, parts, / - /); if (counts[parts[2]] > 1) {print name}}}' < <(printf '%s\n' *)

Exemplo de saída:

027 - Solar Eclipse.mp3
003 - Solar Eclipse.mp3
244 - Rolling Hills.mp3
103 - Rolling Hills.mp3

Não é garantido que a ordem dos arquivos na saída seja agrupada (mesmo que esteja neste exemplo simples. Se você tiver GNU AWK ( gawk), poderá agrupar a saída:

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' *)

Se não tiver gawk, você pode usar sort:

awk ... | sort -k3,3

Em vez de printfusar a substituição de processo, você pode canalizá-la para o script AWK. Ou você pode usar findem um canal ou usando substituição de processo se quiser fazer isso recursivamente. Se você deseja que uma execução recursiva compare nomes de arquivos globalmente, será necessário remover os nomes de diretório findgerados por padrão.

informação relacionada