한 디렉토리에 많은 파일이 있고 파일이 모두 고유한지 확인하고 싶습니다. 단순화를 위해 foo.txt
, bar.txt
및 3개의 파일이 있다고 가정해 보겠습니다 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
...하지만 실제로는반품다른 파일의 전체 내용을 인쇄합니다. 위의 동작만 발생하도록 이 동작을 억제할 수 있는 방법이 있습니까?
아니면, 거기 있나요?이 작업을 수행할 수 있는 다른 도구?
답변1
이렇게 하면 트릭을 수행할 수 있습니다.
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}'
답변2
두 파일이 동일한지 확인하려면 을 사용하십시오 cmp
. 동일한 파일만 출력하려면 다음을 사용하십시오.
for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done
diff
사람이 읽을 수 있는 짧은 차이점 목록을 생성해 보십시오. 이 작업에는 상당한 시간이 걸릴 수 있으므로 필요하지 않은 경우 오버헤드를 피하십시오.
답변3
이것가장 빠른이 목적으로 작성된 도구는 다음과 같습니다.레플리카(Fedora 및 Ubuntu 패키지 저장소에서 찾을 수 있습니다...)
용법:
fdupes -r dir1 dir2
답변4
목록에서 동일한 파일을 찾으려면 먼저 크기별로 정렬하세요.
ls -S
그런 다음 동일한 크기의 각 파일 세트에 대해 md5sum
이를 실행하여 어떤 파일이 동일한지 쉽게 확인할 수 있습니다.
대용량 파일의 경우 전체 파일의 작은 부분만 먼저 확인하는 것이 더 빠릅니다.
dd if=file bs=512 count=1 | md5sum
그런 다음 의심스러운 파일에 대해서만 전체 체크섬을 수행하십시오.