O primeiro script é uma extensão da resposta de Sergei Lomakov , mas foi um pouco longo demais para um comentário. Ele serve para espaços em nomes de arquivos e cita cada "nome". Este método não requer uma etapa classificar .
O segundo script é outra maneira, usando sort + awk, mas sem o processamento da matriz do primeiro método. Claro, ele perde a sequência de entrada, se isso é um problema para você, (mas está tudo bem para a pergunta, já que ela usa uma etapa de classificação).
Ambos os métodos também usam sed para introduzir \x00
como um separador de campo; para habilitar o tratamento de espaços em branco.
método 1, arrays no awk.
find . -type f |
xargs -I {} md5sum {} |
sed 's/ [ *]/\x00/' | # " "==text, " *"==binary
awk -F"\x00" '{
if( md5s[$1] == "" ) {sep=""} else {sep=FS}
md5s[$1]=md5s[$1] sep $2 }
END{ for(md5 in md5s ) {
if( (split(md5s[md5], names, FS)) > 1 ) {
sep="\""
for( ix in names ) {
printf "%s%s", sep, names[ix]
sep="\" \"" }
print "\"" } } }'
método 2, classifique + awk.
find . -type f |
xargs -I {} md5sum {} |
sort |sed 's/ [ *]/\x00/' | # " "==text, " *"==binary
awk -F"\x00" '{
if (pkey!=$1) { ct=-1; pkey=$1; pnam=$2 }
else{if (++ct) { printf(" \"%s\"",$2) }
else { printf("%s\"%s\" \"%s\"",nl,pnam,$2)
nl="\n" } } }
END{ print "" }'
Saída
"./tt.txt" "./tx.txt"
"./ize2.txt" "./ize3.txt" "./ize.txt"