다른 디렉토리에 없는 파일 찾기

다른 디렉토리에 없는 파일 찾기

dir1의 어디에나 존재 하지만 의 어디에도 존재하지 않는 모든 파일을 찾아야 합니다 dir2. 구조가 다를 수 있으므로 dir1제대로 작동하지 않습니다.dir2diff -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을 사용하게 됩니다. sha224sum56개, sha256sum64개, sha512sum128개가 필요합니다.

CYA 수준: 편집증

메타데이터가 파일에 보관되는 일부 캐싱 체계에서는 작동하지 않을 수 있습니다.이름에 원본 파일의 해시가 포함되어 있는 경우.

(실제로 몇 년 전 Wordpress + Magento를 설치했을 때 이런 일이 발생했습니다. 우리는 더 이상 사용되지 않는 항목을 제거하면서 거대한 기사 캐시를 마이그레이션하려고 했습니다.)

이 경우 grep잘못된 긍정 반환을 방지하고 메타데이터 항목을 원본 파일로 착각하는 것을 방지하기 위해 다른 해싱 체계(빠른 수정)를 사용해야 합니다(따라서 캐시가 MD5를 사용하는 경우 SHA1을 사용하거나 그 반대의 경우도 마찬가지). 또는 sed"짧은" 파일의 모든 줄을 다시 작성하여 처음에 "^"를 추가하여 고정된 정규식으로 만들고 플래그를 제거하여 -F파일 grep을 일반 문자열 대신 정규식으로 처리합니다.

답변3

그래서 제가 찾은 부분적인 해결책은 다음과 같습니다.

find dir1 -type f | grep -vxFf <(fdupes -r dir1 dir2)

하지만 "부분"이라고 말한 이유는 에 중복된 항목이 있으면 dir1표시되지 않으므로 fdupes -r dir1먼저 실행해야 하기 때문입니다.

관련 정보