Classifique a lista de nomes de arquivos de uma maneira que não diferencia maiúsculas de minúsculas e imprima duplicatas. sort
tem uma opção para classificação insensível a maiúsculas e minúsculas. O mesmo acontece com o GNU uniq
, mas não com outras implementações, e tudo o que você pode fazer com uniq
é imprimir todos os elementos em um conjunto de duplicatas, exceto o primeiro encontrado. Com as ferramentas GNU, supondo que nenhum nome de arquivo contenha uma nova linha, existe uma maneira fácil de imprimir todos os elementos, exceto um em cada conjunto de duplicados:
for x in *; do printf "%s\n" "$x"; done |
sort -f |
uniq -id
Portavelmente, para imprimir todos os elementos em cada conjunto de duplicatas, assumindo que nenhum nome de arquivo contenha uma nova linha:
for x in *; do printf "%s\n" "$x"; done |
sort -f |
awk '
tolower($0) == tolower(prev) {
print prev;
while (tolower($0) == tolower(prev)) {print; getline}
}
1 { prev = $0 }'
Se você precisar acomodar nomes de arquivos contendo novas linhas, vá para Perl ou Python. Observe que você pode precisar ajustar a saída ou, melhor, fazer o processamento posterior na mesma linguagem, já que o código de amostra abaixo usa novas linhas para separar nomes em sua própria saída.
perl -e '
foreach (glob("*")) {push @{$f{lc($_)}}, $_}
foreach (keys %f) {@names = @{$f{$_}}; if (@names > 1) {print "$_\n" foreach @names}}
'
Aqui está uma solução puramente zsh. É um pouco detalhado, já que não há uma maneira integrada de manter os elementos duplicados em um resultado de matriz ou glob.
a=(*)(N); a=("${(@io)a}")
[[ $#a -le 1 ]] ||
for i in {2..$#a}; do
if [[ ${(L)a[$i]} == ${(L)a[$((i-1))]} ]]; then
[[ ${(L)a[$i-2]} == ${(L)a[$((i-1))]} ]] || print -r $a[$((i-1))]
print -r $a[$i]
fi
done