Quando a única diferença é que os arquivos de booth de nome devem ter o mesmo conteúdo e tamanho.
1. Sobre o conteúdo. Podemos comparar dois arquivos pelo comando diff file-1 file-2
. Também podemos usar este comando para um teste desta forma:
diff -q file-1 file-2 > /dev/null && echo 'equal' || echo 'different'
2. Sobre o tamanho. Podemos encontrar um arquivo com determinado tamanho pelo comando (onde 12672 é o tamanho do arquivo em bytes):
find /path/to/search -type f -size 12672c -printf '%p\n'
Ou podemos usar um intervalo dessa forma (onde 12600-12700 é o intervalo de tamanho de arquivo em bytes):
find /path/to/search -type f -size -12700c -size +12600c -printf '%p\n'
Note que, por padrão, o comando find
funciona recursivamente.
3. Combine os dois métodos (onde file-1
é o nosso arquivo padrão):
find /path/to/search -type f -size -12700c -size +12600c -printf '%p\t' -exec sh -c 'diff -q file-1 "" > /dev/null && echo "equal" || echo "different"' sh {} \;
4. Exemplo. Vamos supor que temos a seguinte estrutura de diretórios:
$ tree /tmp/test
/tmp/test
├── file-1 # this is the pattern file
├── file-2 # this is almost the same file but wit few additional characters
└── file-3 # this is exact copy of file-1
O resultado do comando acima será:
$ find /tmp/test -type f -size -12700c -size +12600c -printf '%p\t' -exec sh -c 'diff -q file-1 "" > /dev/null && echo "equal" || echo "different"' sh {} \;
/tmp/test/file-2 different # OK: here we have added few additional characters
/tmp/test/file-3 equal # OK: this is exact copy of file-1
/tmp/test/file-1 equal # OK: this is file-1 compared to its self
Ou podemos simplificar a saída alterando nosso comando desta maneira:
$ find /tmp/test -type f -not -name "file-1" -size -12700c -size +12600c \
-exec sh -c 'diff -q file-1 "" > /dev/null && printf "%s\tis equal\n" ""' sh {} \;
/tmp/test/file-3 is equal
Atualizar a partir dos comentários. O comando a seguir encontra um arquivo com o mesmo tamanho que o file-1
e, em seguida, o diff
está envolvido nas opções --brief
e --report-identical-files
:
find /path -type f -not -name "file-1" -size $(stat -c%s file-1)c -exec diff -qs file-1 {} \;
Files file-1 and /tmp/test/file-3 are identical
Nós podemos compare md5sum dos arquivos desta forma:
-
Obtenha o md5sum do arquivo padrão:
$ md5sum file-1 d18b61a77779d69e095be5942f6be7a7 file-1
-
Use-o com nosso comando:
$ find /path -type f -not -name "file-1" -size $(stat -c%s file-1)c -exec sh -c 'echo "d18b61a77779d69e095be5942f6be7a7 " | md5sum -c -' sh {} \; /tmp/test/file-3: OK