나는 가지고있다:
checksum.txt
마운트 후 연결이 끊어져 불완전한 상태로 남아 있는 대규모 디렉터리의 마운트 지점에 있는 단일 파일의 여러 줄 체크섬이 포함된 파일 (checksum.txt
부분 체크섬)localchecksums.txt
수천 줄의 SHA256 체크섬, 파일 이름 등을 포함한 완전한 체크섬 목록
제 생각에는:
- 원격 설치 체크섬을 로컬 체크섬
sha256sum -c checksum.txt localchecksum.txt
또는 이와 유사한 것과 비교하십시오. 단, 다음을 수행하십시오.
- 나머지 해시를 얻기 위해 다시 기가바이트의 데이터를 처리하고 싶지 않습니다.
- 전체 프로세스를 다시 시작하고 싶지 않습니다.
checksum.txt
find
재귀를 사용하여 단일 파일을 찾아 sha256sum
실행함으로써 목록을 생성합니다.
나머지 해시는 두 파일을 비교하여 얻거나 checksum.txt
파일을 읽고 확인되지 않은 파일의 체크섬만 계산하여 체크섬을 계속 확인할 수 있습니다. 첫 번째 접근 방식의 문제점은 파일의 순서가 다르다는 것입니다. 두 번째 방법이 좋을 것 같지만 어떻게 시작해야 할지 모르겠습니다.
체크섬 파일의 예:
8e2931cc1ad3adc07df115456b36b0dbd6f80f675e0a9813e20ad732ae5d4515 ./folder/8ggSHp5I7hNEl3vDCbWv6Q/wA-KzXIh1Ce3G93s20X24v_4vUeywBe3mXPhGjPt_Lg/cRf8KgbqIsqwbon3DX3PN1-oV6_Nr9Baeymaw-ZJw00
37d2dfe2315cc401536329e3fbe421384bbb50c656c3dbeb42798e5666822e6c ./folder/8ggSHp7I7hHEl3vDCbWv6Q/wA-KzXIh1Ce3G93s2oX24v_4vUeywBe3mXPhGjPt_Lg/V02s6HKhyJ9Nyd2jQtSjWg
d0e9b95065a264db0d372ccace5d3a72f38f74ca7b44da4794dae23c91e18e57 ./folder/8ggSHp7I7hNxl3vDCbWv6Q/wA-KzXIh1Ce3G93s2oX24v_4vUeywBe3mXPhGjPt_Lg/U3fhBugX6pexYzh6qGKlW7lYWsFShWH7JwN9fmU8ay2lLZkciH2sXsiGbmIc97iJ
44a5fe29063e472857bb9a1929af06a32bb4b2394630f80c2dc732fd662620bc ./folder/8ggSHp7I7hNEc3vDCbWv6Q/wA-KzXIh1Ce3G93s2oX24v_4vUeywBe3mXPhGjPt_Lg/gTrqUL4ZjWTWMl6BcjfwUe5bBDatscwUoYY9IFQDztc
답변1
원칙적으로,
sort
체크섬이 포함된 파일 이름 목록find
sort
파일 이름의 전체 목록comm
아직 처리되지 않은 파일 세트를 가져오는 데 사용됩니다 (한 그룹의 파일은 다른 그룹에 없음).sha256sum
결과 목록의 파일에 대한 체크섬 생성
데모( bash
아님 sh
):
based=/etc # Directory base
csums=/tmp/etc_checksums.txt # Checksums file
# EXAMPLE ONLY
# TAKE CARE NOT TO OVERWRITE YOUR REAL DATAFILE WHILE TESTING !!
# Generate a partial set of 30 checksums
find "$based" -type f |
head -n30 |
while IFS= read -r f; do sha256sum "$f"; done >"$csums"
# USEFUL WORK
# Identify the set of differences
LC_ALL=C comm -13 <(sed 's/^[^ ]* //' "$csums" | LC_ALL=C sort) <(find "$based" -type f | LC_ALL=C sort) |
# For each missing item
while IFS= read -r f
do
# Generate a new checksum and append it to the checksums file
printf '%s' "$f" >&2
sha256sum -- "$f" >>"$csums" && echo >&2
done
이 코드는 공백이 포함된 파일 이름에는 작동하지만 줄 바꿈 및 기타 인쇄할 수 없는 문자가 포함된 병리학적인 파일 이름에는 작동하지 않습니다. (정말 필요한 경우 다른 사람들이 코드를 방탄하는 방법을 제안할 수 있다는 것은 의심의 여지가 없습니다.)
원본 체크섬 파일을 수정하기 전에 주의 깊게 테스트하십시오. 중복 항목이 올바르게 필터링될 수 $based
있도록 원래 시작 지점과 일치하는지 확인하세요 .comm