dir1
에 존재하지만 존재하지 않는 모든 파일을 찾아야 합니다 dir2
. dir1
그리고 dir2
구조가 달라서 diff -r
제대로 작동하지 않을 수도 있습니다.
답변1
경로 없이 파일 목록을 만들어 보세요. 이 방법으로 두 디렉터리를 비교할 수 있습니다. 단, 파일명은 모두 달라야 합니다. 동일한 파일 이름이 dir1의 다른 하위 디렉터리에서 재사용되는 경우 경로를 삭제하면 파일 이름의 고유성이 제거됩니다. 다음과 같이 경로 이름 없이 각 디렉터리의 목록을 얻을 수 있습니다.
find dir1/ -exec basename {} \; | sort
find dir2/ -exec basename {} \; | sort
모든 것이 합쳐지면 다음과 같습니다.
diff <(find dir1/ -exec basename {} \; | sort) <(find dir2/ -exec basename {} \; | sort)
fdupes 사용을 제안하는 댓글을 봤습니다. fdupes
확실히 더 나은 해결책이 있다면.
답변2
대략적인 접근 방식은 을 사용하는 것입니다 md5sum
. 길이가 0인 파일은 항상 중복으로 간주되므로 find
길이가 1바이트 이상인 파일만 원할 것입니다.
find /first/path -type f -exec md5sum -b \{\} \; > /tmp/md5-path1.txt
cut -b1-32 < /tmp/md5-path1-short.txt
find /second/path -type f -exec md5sum -b \{\} \; > /tmp/md5-path2.txt
cut -b1-32 < /tmp/md5-path2-short.txt
path2에 없는 path1의 파일("-v" 옵션 제거)
grep /tmp/md5-path1.txt -v -F -f /tmp/md5/path2-short.txt
CYA 레벨: 전문가
위의 32는 MD5 해시 값의 길이가 32바이트이기 때문입니다. 예를 들어, sha1sum
충돌 가능성이 더 낮은 를 사용하는 경우 길이 40을 사용 sha224sum
하면 56, sha256sum
64, sha512sum
128이 필요합니다.
CYA 수준: 편집증
메타데이터가 파일에 저장되는 일부 캐싱 시나리오에서는 작동하지 않을 수 있습니다.이름에 원본 파일의 해시가 포함되어 있는 경우.
(이것은 실제로 몇 년 전 오래된 항목을 제거하는 동안 거대한 포스트 캐시를 마이그레이션하려고 했던 WordPress + Magento 설치에서 발생했습니다.)
이 경우 다른 해싱 체계(빠른 수정)를 사용하여 원본 파일에 대한 메타데이터 항목을 착각하여 잘못된 긍정을 반환하는 것을 방지해야 합니다 ( grep
따라서 캐시가 MD5를 사용하는 경우 SHA1을 사용하고 그 반대도 마찬가지임). sed
"짧은" 파일을 사용하여 시작 부분에 "^"를 추가하여 고정된 정규식으로 만들고, 플래그를 제거하여 파일을 일반 문자열이 아닌 정규식으로 처리합니다 -F
.grep
답변3
그래서 제가 찾은 해결책의 일부는 다음과 같습니다.
find dir1 -type f | grep -vxFf <(fdupes -r dir1 dir2)
하지만 "부분적으로"라고 말한 이유는 에 중복 항목이 있으면 dir1
표시되지 않으므로 fdupes -r dir1
먼저 실행해야 하기 때문입니다.