한 폴더의 모든 파일이 다른 폴더에도 있는지 확인

한 폴더의 모든 파일이 다른 폴더에도 있는지 확인

a기본적으로 여러 이미지가 포함된 디렉토리가 있습니다. 이제 이 모든 이미지가 디렉토리에 있는지 확인하고 싶습니다 b. 요점은 많은 이미지가 b하위 디렉터리에 직접 있는 것이 아니라 b하위 디렉터리 내부에 있다는 것입니다.

또한 파일 이름에 의존하지 않고 파일 내용에 의존하고 싶습니다.

(bash 태그 때문에: 저는 bash 답변을 선호하지만 다른 언어이거나 다른 프로그램을 사용하는 경우에도 괜찮습니다)

답변1

내용별로 비교하고 싶기 때문에 해시를 이용하는 것이 좋은 것 같습니다.

find이 명령을 사용하여 디렉터리의 파일 경로 목록을 가져올 수 있습니다. 이 -type f옵션은 모든 디렉터리를 무시하고 일반 파일의 출력 경로만 무시합니다. 이 옵션은 발견된 경로를 가져와 md5 해시 목록 + 파일 경로('md5_hash /path/to/file')로 변환하는 -exec md5sum {} \;명령에 제공합니다 .md5sum

cut이 목록을 명령 에 파이프합니다 . 첫 번째 옵션은 -f 1첫 번째 열(해시 값)만 사용하도록 지시합니다. 두 번째는 -d ' '열 사이의 구분 기호로 공백 문자를 사용하도록 지시합니다. 기본값은 탭입니다.

더 쉽게 만들기 위해 해당 해시 목록을 정렬 명령에 연결합니다 diff.

연산자 <( command )가 호출됩니다프로세스 교체. 명령의 출력을 가져와 이를 입력으로 요구하는 명령의 의사 파일로 변환합니다(간단하지 않은 설명을 보려면 링크를 따르세요). 이렇게 하면 diff두 파일을 비교하려는 것처럼 보입니다.

:~$ diff <(find folder1/ -type f -exec md5sum {} \; | cut -f 1 -d ' ' | sort) \
    <(find folder2/ -type f -exec md5sum {} \; | cut -f 1 -d ' ' | sort)

참고: 폴더1/ 및 폴더2/를 실제 폴더로 바꾸는 것을 잊지 마십시오.

그러면 그 중 하나에만 있는 파일에 대한 md5 해시 목록이 제공됩니다.

실제로 누락된 파일을 알고 싶다면 다음을 수행할 수 있습니다.

:~$ find folder1/ -type f -exec md5sum {} \; | sort | grep my_md5_hash

확인할 파일이 많으면 <(find ...)다음과 같이 두 명령의 결과를 저장하고 비교하는 것이 좋습니다.

:~$ diff list1.txt list2.txt
:~$ cat list1.txt | grep my_md5_hash

답변2

답변 보기비슷한 질문에 대해서는2주 전부터요.

find . -type f -exec md5sum {} + | sort | sed 's/  */!/1' | awk -F\| 'BEGIN{first=1}{if($1==lastid){if(first){first=0;print lastid, lastfile}print$1, $2} else first=1; lastid=$1;lastfile=$2}'

답변3

*.jpg 파일이라고 가정하고 다음을 수행합니다.

기존 파일을 찾으려면:

grep -Ff <(for i in </path/to/directory/a>/*.jpg ; do md5sum $i | awk {'print $1'}; done) <(find </path/to/directoryb/ -iname "*.jpg" | xargs md5sum)

여기서 루프는 for"a" 디렉터리의 모든 파일에 대한 md5 체크섬 목록을 생성하고, 여기에서는 "b" 디렉터리(하 디렉터리 포함)의 모든 파일에 대한 md5 체크섬 목록을 생성합니다.*.jpgfind*.jpg

두 목록이 비교 되고 grep -fF완전한 명령은 2개의 출력 열을 생성합니다. 첫 번째 열은 존재하는 파일의 md5 체크섬이고 두 번째 열은 'b' 디렉터리에 있는 일치하는 파일의 파일 이름(전체 경로 포함)입니다. . | awk {'print $2'}파일 이름만 얻으려면 추가를 사용할 수 있습니다.

존재하지 않는 파일을 찾으려면:

grep -vFf <(for i in </path/to/directory/a>/*.jpg ; do md5sum $i | awk {'print $1'}; done) <(find </path/to/directoryb/ -iname "*.jpg" | xargs md5sum)

첫 번째 grep 명령과 동일한 작업을 수행하지만 이 -v옵션을 사용하여 일치하지 않는 콘텐츠만 나열합니다.

무엇을 찾고 계신가요:

"a" 디렉터리에 모든 파일이 존재하는 경우 두 번째 grep은 출력을 반환하지 않아야 합니다.

*.jpg를 검색하려는 확장자로 바꾸세요.

man페이지 에서 grep:

   -f FILE, --file=FILE
          Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.
          (-f is specified by POSIX.)

    -F, --fixed-strings
          Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to  be  matched.   (-F  is
          specified by POSIX.)

-v, --invert-match
              Invert the sense of matching, to select non-matching lines. 

관련 정보