주어진 파일에서 디렉토리 트리 체크섬 계속

주어진 파일에서 디렉토리 트리 체크섬 계속

나는 가지고있다:

  • checksum.txt마운트 후 연결이 끊어져 불완전한 상태로 남아 있는 대규모 디렉터리의 마운트 지점에 있는 단일 파일의 여러 줄 체크섬이 포함된 파일 ( checksum.txt부분 체크섬)
  • localchecksums.txt수천 줄의 SHA256 체크섬, 파일 이름 등을 포함한 완전한 체크섬 목록

제 생각에는:

  • 원격 설치 체크섬을 로컬 체크섬 sha256sum -c checksum.txt localchecksum.txt또는 이와 유사한 것과 비교하십시오. 단, 다음을 수행하십시오.
  1. 나머지 해시를 얻기 위해 다시 기가바이트의 데이터를 처리하고 싶지 않습니다.
  2. 전체 프로세스를 다시 시작하고 싶지 않습니다.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

원칙적으로,

  1. sort체크섬이 포함된 파일 이름 목록
  2. findsort파일 이름의 전체 목록
  3. comm아직 처리되지 않은 파일 세트를 가져오는 데 사용됩니다 (한 그룹의 파일은 다른 그룹에 없음).
  4. 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

관련 정보