验证 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而不是 shell 功能来预先添加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进行转义,并且在处于检查模式时,在需要转义的文件名前添加 a ,从而使通过连接文件的相对路径和打印的文件名\获得的路径不适合重用。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}"

如果你的路径确实包含换行符你需要比这更聪明的东西;-)

相关内容