Parece que você:
- obtenha uma lista de arquivos
- seus tamanhos, etc.
- em seguida, gere md5sums de arquivos do mesmo tamanho
- e desses, imprima os com o mesmo md5sum
Eu não vou tentar consertar o código awk. Em vez disso, observe que você está replicando a funcionalidade do comando fdupes
. De a página de manual :
Searches the given path for duplicate files. Such files are found by
comparing file sizes and MD5 signatures, followed by a byte-by-byte
comparison.
Eu sugiro que você o use em vez de escrever scripts complexos para isso.
Caso contrário, a eliminação da verificação de tamanho facilita muito a localização de duplicatas:
$ md5sum * | sort -k1,1 | uniq -w32 -D
b1946ac92492d2347c6235b4d2611184 file1
b1946ac92492d2347c6235b4d2611184 file2
b1946ac92492d2347c6235b4d2611184 file3
Todos os hashes de md5sums
têm uma largura de 32 caracteres, por isso é fácil dizer à impressão uniq
para comparar apenas esses 32 caracteres e imprimir todas as duplicatas encontradas.
Se você realmente precisa ter uma verificação de tamanho, ela se torna bastante complexa, mas ainda mais simples que seu script. find
pode imprimir tamanhos de arquivo, então não há necessidade de trazer ls
para o mix:
find . -maxdepth 1 -type f -printf "%s/%P\n" |
awk -F/ ' # Use / as delimiter, it wont appear in filename
s[$1]++ { # if the file size has appeared before
if (n[$1]) { # if the first name hasnt been printed yet
print n[$1] # print it and delete it
n[$1] = "";
}
print $2; # print filename with duplicated size
next
} {n[$1] = $2} # save filename for each new size encountered'
Este comando awk imprimirá todos os arquivos cujos tamanhos foram duplicados.
Agora, basta usar o md5sum | sort | uniq
pipeline mencionado anteriormente:
find -maxdepth 1 -type f -printf "%s/%P\n" |
awk -F/ 's[$1]++ {if (n[$1]){print n[$1]} print $2; n[$1] = ""; next} {n[$1] = $2}' |
xargs -d '\n' md5sum |
sort -k1,1 |
uniq -w32 -D