localize arquivos com nomes semelhantes

1

Estou executando o OS X 10.7.3. Eu 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 de arquivos são os mesmos, exceto para o prefixo. Por exemplo:

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

A partir dessa lista, eu gostaria de filtrar todas as entidades com nomes "totalmente exclusivos", neste caso: 008 - Beautiful Day.mp3

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

Muito obrigado!

    
por gooogalizer 29.05.2012 / 01:26

2 respostas

0

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

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

    
por 29.05.2012 / 03:48
0

Isto irá imprimir uma lista dos nomes dos 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 do arquivo 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

A ordem dos arquivos na saída não é garantida para ser agrupada (mesmo que seja neste exemplo simples. Se você tiver o GNU AWK ( gawk ) você pode 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 você não tem gawk , pode usar sort :

awk ... | sort -k3,3

Em vez de printf usando a substituição do processo, você pode canalizá-lo para o script AWK. Ou você pode usar find em um pipe ou usando substituição de processo se quiser fazer isso de forma recursiva. Se você quiser que uma execução recursiva compare os nomes de arquivos globalmente, será necessário remover os nomes dos diretórios que find produz por padrão.

    
por 29.05.2012 / 09:53