output somente quando as primeiras colunas são as mesmas

4

ENTRADA:

[USER@NOTEBOOK ~/proba] find . -type f | xargs -I "{}" md5sum "{}" | sort
18b17ef2e55f6fd2deb044943a8a769d  ./yes
2b00042f7481c7b056c4b410d28f33cf  ./tt.txt
2b00042f7481c7b056c4b410d28f33cf  ./tx.txt
698458eb994fafdf56c1f63295c942ad  ./laksjdasdff.txt
764efa883dda1e11db47671c4a3bbd9e  ./ize2.txt
764efa883dda1e11db47671c4a3bbd9e  ./ize3.txt
764efa883dda1e11db47671c4a3bbd9e  ./ize.txt
a787d6f5ce5deb6e2e4b004f95da5655  ./laksjdf.txt
[USER@NOTEBOOK ~/proba] 

OUTPUT:

[USER@NOTEBOOK ~/proba] find . -type f | xargs -I "{}" md5sum "{}" | sort | SOMEMAGIC
tt.txt tx.txt
ize2.txt ize3.txt ize.txt
[USER@NOTEBOOK ~/proba] 

Então, eu preciso de um "SOMEMAGIC" que apenas produza nomes de arquivos se o md5sum corresponder (uma linha por md5sum). (Será um script de deduplicação ..)

    
por gasko peter 23.06.2012 / 09:03

2 respostas

2

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"
    
por 23.06.2012 / 22:29
4

Use essa "mágica":)

find . -type f | xargs -I "{}" md5sum "{}" | awk '{count[$1]=count[$1]" "$2}END{for(j in count) if( (split(count[j], A)) > 1) print count[j]}' | sed -e 's/\.\///g'
    
por 23.06.2012 / 10:56

Tags