Usando o utilitário cksum
padrão junto com awk
:
find . -type f -exec cksum {} + | awk '!ck[$1$2]++ { print $3 }'
O utilitário cksum
gerará três colunas para cada arquivo no diretório atual. A primeira é uma soma de verificação, a segunda é um tamanho de arquivo e a terceira é um nome de arquivo.
O programa awk
criará uma matriz, ck
, codificada na soma de verificação e no tamanho. Se a chave ainda não existir, o nome do arquivo será impresso.
Isso significa que você obtém os nomes dos arquivos no diretório atual que possuem checksums + size exclusivos. Se você obtiver mais de um nome de arquivo, os dois terão somas de verificação e / ou tamanho diferentes.
Teste:
$ ls -l
total 8
-rw-r--r-- 1 kk kk 0 Oct 3 16:32 file1
-rw-r--r-- 1 kk kk 0 Oct 3 16:32 file2
-rw-r--r-- 1 kk kk 6 Oct 3 16:32 file3
-rw-r--r-- 1 kk kk 0 Oct 3 16:32 file4
-rw-r--r-- 1 kk kk 6 Oct 3 16:34 file5
$ find . -type f -exec cksum {} + | awk '!ck[$1$2]++ { print $3 }'
./file1
./file3
Os arquivos file1
, file2
e file4
estão vazios, mas file3
e file5
têm algum conteúdo. O comando mostra que há dois conjuntos de arquivos: Aqueles que são iguais a file1
e aqueles que são iguais a file3
.
Também podemos ver exatamente quais arquivos são os mesmos:
$ find . -type f -exec cksum {} + | awk '{ ck[$1$2] = ck[$1$2] ? ck[$1$2] OFS $3 : $3 } END { for (i in ck) print ck[i] }'
./file3 ./file5
./file1 ./file2 ./file4