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 체크섬 목록을 생성합니다.*.jpg
find
*.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.