
folder/to/check/
각 파일에 대해 수천 개의 이미지(414G)가 있는 다른 디렉토리에 이미 존재하는지 확인하려는 수천 개의(70G) 이미지가 있는 폴더가 있습니다 folder/to/search/
.
제가 생각해낸 스크립트인데 실행하는 데 시간이 너무 오래 걸리기 때문에 작업을 최적화할 수 있을 것 같아요.
find folder/to/check/ -type f -exec md5sum {} + | awk -F" " '{ print $1,$2 }' | while read -r p1 p2; do find folder/to/search/ -type f -exec md5sum {} + | grep "^$p1" && echo "Found: $p1 $p2" || echo "Not found: $p1 $p2"; done > out.txt
스크립트를 최적화하는 방법에 대한 올바른 방향을 알려줄 수 있는 사람이 있습니까? 내 실력은 아주 기초적이지만.
답변1
이 작업을 수행.
"to-check" 폴더에 있는 각 이미지의 md5 합계를 계산하고 이를 텍스트 파일에 씁니다.
"검색할" 폴더에 있는 각 이미지의 md5 합계를 계산하고 첫 번째 파일에 추가합니다.
이 거대한 파일을 새 파일로 정렬하십시오.
uniq -c
각 줄이 중복되는 횟수를 계산하는 것과 같은 것을 사용하십시오 .
명령을 올바르게 받았다면(그렇지 않을 수도 있음) 지금은 md5sum
총 X * Y 번 실행하고 있다고 생각하지만 위의 경우 X + Y 번으로 줄어듭니다.
답변2
mtree
동일하거나 다른 타임스탬프 또는 동일하거나 다른 MD5/SHA256 해시를 찾기 위해 두 개의 파일 계층을 비교해야 할 때마다 편리한 유틸리티입니다.
간단한 테스트 계층 구조를 설정해 보겠습니다.
$ mkdir -p folder/to/check
$ mkdir -p folder/to/search
$ for N in $(jot -w %03d 10); do touch `/image-$N.jpg; done
$ for N in $(jot -w %03d 10 2); do touch folder/to/search/image-$N.jpg; done
folder/to/check
을 image-001
통한 파일이 있고 -010
을 folder/to/search
통해 파일이 있습니다 . 모든 파일은 동일하지만(길이가 0바이트) 타임스탬프가 다릅니다.image-002
-011
만약 너라면오직MD5 해시(및 각 파일의 유무)를 확인하려면 다음을 수행하세요.
$ mtree -kmd5 -cp folder/to/check | mtree -p folder/to/search
extra: image-011.jpg
./image-001.jpg missing
이 행 은 에 있었지만 반드시 존재할 필요는 없었다고 extra
말하고 ( 에 없기 때문에 ) 이 행은 가 소스 폴더( )에서 발견되었지만 대상 폴더( )에서는 발견되지 않았음을 나타냅니다.image-011.jpg
folder/to/search
folder/to/check
missing
image-001.jpg
folder/to/check
folder/to/search
MD5 해시 외에 타임스탬프도 확인하려면 다음을 수행하세요.
$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search
.: modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-009.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing
해당 출력에는 여전히 동일한 행 extra
과 missing
MD5 해시에서 동일하지만 타임스탬프가 다른 여러 파일이 표시됩니다. 마지막으로 파일에 해당 파일과 다른 MD5 해시가 있는 경우 mtree
어떤 파일인지 알려줍니다.
$ date > folder/to/search/image-007.jpg
$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search
.: modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg:
size (0, 29)
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:25:05 2019)
md5digest (0xd41d8cd98f00b204e9800998ecf8427e, 0x6fd624d18a8fe0c096b19ff858a2acf7)
image-009.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing
답변3
이 작업을 수행할 수 있는 유틸리티가 있지만 직접 수행하려면 다음과 같이 하십시오.
- 모든 파일의 크기를 바이트 단위로 가져오고 동일한 크기의 모든 파일 목록을 만듭니다.
- 요소가 두 개 이상인 목록의 경우(특히 큰 파일의 경우 그다지 많지는 않음):
- 목록의 모든 요소의 MD5를 계산합니다.
- 중복 확인
본질적으로 이는 MD5 해시를 계산하게 합니다.한 번크기를 구별할 수 없는 파일에만 해당됩니다.
물론 이는 기존 파일이나 새 파일 사이에 중복이 없다고 가정합니다(그러나 이를 확인하기 위해 쉽게 조정할 수도 있습니다).