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 printf
usar a substituição de processo, você pode canalizá-la para o script AWK. Ou você pode usar find
em 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 find
gerados por padrão.