디렉토리의 모든 파일을 비교할 수 있습니까? [복사]

디렉토리의 모든 파일을 비교할 수 있습니까? [복사]

다양한 디렉토리에 많은 파일이 저장되어 있습니다. 서로 다른 시점에 생성되지만 내용이 동일한지 확인해야 합니다. diff디렉터리의 모든 파일에 대해 작업을 수행하는 방법을 찾을 수 없습니다 . 이것이 가능합니까, 아니면 다른 CLI 도구가 필요합니까?

답변1

굳이 비교할 필요 없이 그냥 알고 싶다면만약에그것들은 다릅니다. for 루프를 사용하여 디렉토리의 각 파일을 디렉토리의 임의의 파일과 비교할 수 있습니다.

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

... known-file디렉토리에 있는 특정 파일입니다. 출력이 없으면 파일에 차이가 없습니다. 그렇지 않으면 known-file.

답변2

표준 cksum유틸리티도 사용하십시오 awk.

find . -type f -exec cksum {} + | awk '!ck[$1$2]++ { print $3 }'

cksum유틸리티는 현재 디렉터리의 각 파일에 대해 세 개의 열을 출력합니다. 첫 번째는 체크섬이고, 두 번째는 파일 크기, 세 번째는 파일 이름입니다.

이 프로그램은 체크섬과 크기로 구성된 awk배열을 생성합니다 . ck키가 아직 존재하지 않으면 파일 이름을 인쇄합니다.

즉, 현재 디렉터리에서 고유한 체크섬 + 크기를 가진 파일 이름을 얻게 됩니다. 파일 이름이 여러 개인 경우 두 파일 이름의 체크섬 및/또는 크기가 다릅니다.

시험:

$ 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

Files file1, file2file4는 모두 비어 있지만 file3file5내용이 일부 있습니다. 이 명령은 두 가지 파일 세트, 즉 와 동일한 파일 file1과 와 동일한 파일이 있음을 보여줍니다 file3.

또한 정확히 어떤 파일이 동일한지 확인할 수도 있습니다.

$ 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

답변3

d 디렉터리에 파일 집합이 있는 경우 중복 파일을 찾는 4개 코드의 결과는 다음과 같습니다.

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

행운을 빕니다... 건배, drl

답변4

GUI 도구 Meld를 ​​사용해 볼 수도 있습니다.

meld dir1 dir2

또는

meld dir1 dir2 dir3

https://meldmerge.org/help/command-line.html

관련 정보