
sha1sumsファイルとmd5sumsファイルを含む一連のディレクトリがあります。これらのファイルの形式は、一般的なhash space space filename
1行に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をエスケープし、スキャンモードにあるときにエスケープする必要があるファイル名の前に追加し、ファイルの相対パスと印刷されたファイル名を連結して\
得られたパスを適切にしません。再利用のため。SHA1SUMS
sha1sum
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}"
、 。
パスに以下が含まれている場合改行文字これよりもスマートなものが必要です;-)