我有一系列包含 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 ,从而使通过连接文件的相对路径和打印的文件名\
获得的路径不适合重用。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}"
。
如果你的路径确实包含换行符你需要比这更聪明的东西;-)