`diff -q`의 반대를 얻을 수 있습니까? 내용을 인쇄하지 않고 동일한 파일과 일치시킵니다.


13

디렉토리에 많은 파일이 있으며 파일이 모두 고유한지 확인하고 싶습니다. : 단순 들어, 나는 세 개의 파일이 있다고 가정 해 보자 foo.txt, bar.txt하고 baz.txt. 이 루프를 실행하면 서로 검사합니다.

$ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done
Files bar.txt and baz.txt differ
Files bar.txt and foo.txt differ
Files baz.txt and bar.txt differ
Files baz.txt and foo.txt differ
Files foo.txt and bar.txt differ
Files foo.txt and baz.txt differ

내가 다루고 싶은 수백 개의 파일들에 대해, 이것은 꽤 읽을 수 없게 될 것이다. 이 파일 목록에 더 좋을 거라 경기를하고 나는 빨리 목록을 살펴 파일은 자신을 일치되어 있는지 확인 할 수 있습니다. 맨 페이지에서 -s옵션이이를 달성 할 것이라고 생각했을 것입니다.

$ for f in ./*; do for i in ./*; do diff -s "$f" "$i"; done; done
Files bar.txt and bar.txt are identical
Files baz.txt and baz.txt are identical
Files foo.txt and foo.txt are identical

... 그러나, 사실 그것은 또한 다른 모든 파일의 전체 내용을 인쇄합니다. 이 동작을 억제하는 방법이 있습니까? 그래서 위의 동작 만 얻습니까?

또는 이것을 달성 할 수있는 다른 도구가 있습니까?

답변:


6

두 파일이 동일한 지 여부를 확인하려면을 사용하십시오 cmp. 동일한 파일에 대해서만 출력을 얻으려면

for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done

diff 짧고 사람이 읽을 수있는 차이점 목록을 만들려고 시도하는 데 시간이 오래 걸릴 수 있으므로 필요하지 않은 경우 오버 헤드를 피하십시오.


12

트릭을 수행해야합니다.

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$'

두 디렉토리는 어디에 dir1있고 어디에 있습니까 dir2?

다음에서 일치하는 디렉토리 만 인쇄하려는 경우 dir1:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $2}'

마찬가지로 다음에서 일치하는 디렉토리 만 인쇄하려는 경우 dir2:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $3}'

이것이 바로 내가 찾던 것입니다. 감사합니다!
Joshua Soileau

diff -qrs큰 파일을 비교할 때 사용 (인쇄 차이를 자동으로 억제)
marcovtwout

4

이 목적으로 작성된 가장 빠른 도구는 fdupes입니다 (Fedora 및 Ubuntu의 패키지 저장소 에서 사용 가능하며…)

용법:

fdupes -r dir1 dir2

2

목록에서 동일한 파일을 찾아야하는 경우 먼저 크기를 기준으로 정렬하십시오 (예 :

ls -S

그런 다음 동일한 크기의 파일 그룹마다 해당 파일을 실행 md5sum하여 어느 파일이 동일한 지 쉽게 확인할 수 있습니다.

큰 파일의 경우 전체 파일의 짧은 부분 만 먼저 체크섬하는 것이 더 빠를 수 있습니다.

dd if=file bs=512 count=1 | md5sum

그런 다음 의심스러운 파일에 대해서만 전체 체크섬을 수행하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.