sha1sumを確認し、破損したファイルのディレクトリとファイル名を印刷します。

sha1sumを確認し、破損したファイルのディレクトリとファイル名を印刷します。

sha1sumsファイルとmd5sumsファイルを含む一連のディレクトリがあります。これらのファイルの形式は、一般的なhash space space filename1行に1つのハッシュ/ファイルです。ファイルを検証し、破損したファイルのパスとファイル名を印刷したいと思います。

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}"、 。

パスに以下が含まれている場合改行文字これよりもスマートなものが必要です;-)

関連情報