Você pode diferenciar todos os arquivos em um diretório? [duplicado]

5

Eu tenho um monte de arquivos armazenados em vários diretórios. Eles foram criados em momentos diferentes, mas preciso verificar se o conteúdo deles é o mesmo. Não consigo encontrar como fazer um diff em todos os arquivos em um diretório. Isso é possível ou é necessária outra ferramenta CLI?

    
por eekfonky 03.10.2017 / 16:08

4 respostas

4

Se você não precisa compará-los, e só precisa saber se eles diferem, você pode apenas diferenciar cada arquivo no diretório com qualquer um dos arquivos no diretório através de um para -loop ...

for i in ./*; do diff -q "$i" known-file; done

... onde known-file é apenas um arquivo no diretório. Se você não obtiver nenhuma saída, nenhum dos arquivos será diferente; senão você obterá uma lista dos arquivos que diferem de known-file .

    
por 03.10.2017 / 16:25
6

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
    
por 03.10.2017 / 16:35
1

Dado um conjunto de arquivos no diretório d, aqui estão os resultados de 4 códigos que procuram arquivos duplicados:

Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution        : Debian 8.9 (jessie) 
bash GNU bash 4.3.30
fdupes 1.51
jdupes 1.5.1 (2016-11-01)
rdfind 1.3.4
duff 0.5.2

-----
 Files in directory d:
==> d/f1 <==
1

==> d/f11 <==
1

==> d/f2 <==
2

==> d/f20 <==
Now is the time
for all good men
to come to the aid
of their country.

==> d/f21 <==
Now is the time
for all good men
to come to the aid
of their country.

==> d/f22 <==
Now is the time
for all good men
to come to the aid
of their countryz

==> d/f3 <==
1


-----
 Results for fdupes:
d/f1                                    
d/f3
d/f11

d/f20
d/f21


-----
 Results for jdupes:
Examining 7 files, 1 dirs (in 1 specified)
d/f1                                                        
d/f3
d/f11

d/f20
d/f21

-----
 Results for rdfind:
Now scanning "d", found 7 files.
Now have 7 files in total.
Removed 0 files due to nonunique device and inode.
Now removing files with zero size from list...removed 0 files
Total size is 218 bytes or 218 b
Now sorting on size:removed 0 files due to unique sizes from list.7 files left.
Now eliminating candidates based on first bytes:removed 1 files from list.6 files left.
Now eliminating candidates based on last bytes:removed 1 files from list.5 files left.
Now eliminating candidates based on md5 checksum:removed 0 files from list.5 files left.
It seems like you have 5 files that are not unique
Totally, 74 b can be reduced.
Now making results file results.txt

-----
 Results for duff:
3 files in cluster 1 (2 bytes, digest e5fa44f2b31c1fb553b6021e7360d07d5d91ff5e)
d/f1
d/f3
d/f11
2 files in cluster 2 (70 bytes, digest 7de790fbe559d66cf890671ea2ef706281a1017f)
d/f20
d/f21

Felicidades ... felicidades, drl

    
por 03.10.2017 / 22:01
0

Você também pode experimentar a ferramenta GUI meld.

meld dir1 dir2

ou

meld dir1 dir2 dir3

link

    
por 03.10.2017 / 16:19