sha1sum을 확인하고 손상된 파일의 디렉터리와 파일 이름을 인쇄합니다.

sha1sum을 확인하고 손상된 파일의 디렉터리와 파일 이름을 인쇄합니다.

sha1sums 및 md5sums 파일이 포함된 일련의 디렉터리가 있습니다. 이러한 파일의 형식은 일반적인 hash space space filename한 줄에 하나의 해시/파일입니다. 파일의 유효성을 검사하고 손상된 파일의 경로와 파일 이름을 인쇄하고 싶습니다.

find . -name SHA1SUMS -execdir echo "$PWD" sha1sum --quiet --check SHA1SUMS \; > logfile

(에서 수정됨여기) 제공

./path1/SHA1SUMS
sda2.ntfs-ptcl-img.gz.aa: FAILED
blkdev.list: FAILED
Info-dmi.txt: FAILED
./path2/SHA1SUMS

그리고 나는 더 많은 것을 찾고 있어요

./path1/sda2.ntfs-ptcl-img.gz.aa: FAILED
./path1/blkdev.list: FAILED
./path2/file: FAILED

출력 유형.

답변1

find . -name SHA1SUMS -exec sh -c '
  cd "${1%/*}" &&
  sha1sum --check --quiet "${1##*/}" 2>/dev/null |
    while IFS= read -r file
    do
      printf "%s\n" "${1%/*}/$file"
    done' sh {} \;

출력은 질문에 표시된 예와 일치해야 하며 임의의 경로에서 작동해야 합니다.

또는 awk쉘 함수 대신 사용하여 SHA1SUMS각 파일 이름 앞에 상대 경로를 추가하십시오.

find . -name SHA1SUMS -exec sh -c '
  cd "${1%/*}" &&
  sha1sum --check --quiet "${1##*/}" 2>/dev/null |
    awk -v pre="${1%/*}" "{ print pre \"/\" \$0 }"' sh {} \;

구현에 따라 sha1sum변경된 파일 이름이 인쇄될 수 있습니다. 특히 GNU *sum유틸리티는 특정 문자 1을 이스케이프하고 검사 모드에 있을 때 이스케이프해야 하는 파일 이름 앞에 를 추가하여 파일의 상대 경로와 인쇄된 파일 이름을 연결하여\ 얻은 경로를 적합하지 않게 만듭니다. 재사용을 위해.SHA1SUMSsha1sum

1 수동( sha1sum매뉴얼은 md5sum) 일반적으로 말하면 "문제의 각 캐릭터에 대한" 매뉴얼을 말합니다.

답변2

#! /bin/bash
here=$(pwd)

find . -name SHA1SUMS | while read -r fname; do
    cd "$here" || exit
    dirn=$(dirname "$fname")
    cd "$dirn" || continue
    sha1sum --quiet --check SHA1SUMS 2>&1 | grep " FAILED" | ( echo -n "$dirn/"; cat )
done > logfile

\n매우 드물지만 디렉터리에 가 포함되어 있으면 이 문제가 발생합니다.

답변3

이 시도:

find . -name SHA1SUMS -execdir \
  sh -c 'sha1sum --quiet -c "$@" | sed "s|^|$PWD/|"' - {} +

디렉토리에 해당 문자가 포함되어 있으면 |sed 대체에 다른 문자를 사용하거나 awk -v p="$PWD/" "{print p\$0}".

경로에 다음이 포함된 경우개행 문자이보다 더 똑똑한 것이 필요합니다 ;-)

관련 정보