ste*_*wie 3 bash hashsum zenity
#!/bin/bash\n\ncd /path-to-directory\nmd5=$(find . -type f -exec md5sum {} \\; | sort -k 2 | md5sum)\n\nzenity --info \\\n--title= "Calculated checksum" \\\n--text= "$md5"\nRun Code Online (Sandbox Code Playgroud)\n目录的递归校验和计算过程需要一段时间。\nbash 脚本\xc2\xb4不会等到该过程完成,它只是移动到下一个命令,即显示计算出的校验和的对话框。因此对话框显示错误的校验和。
\n是否有一个选项可以告诉脚本等待校验和的计算完成?\n此外,是否有一个选项可以将校验和计算的进度通过管道传输到某种进度条,例如在 zenity 中?
\n正如所写,它将被等待。对于脉动进度条:
#! /bin/sh -
export LC_ALL=C
cd /path/to/dir || exit
{
md5=$(
find . -type f -print0 |
sort -z |
xargs -r0 md5sum |
md5sum
)
exec >&-
zenity --info \
--title="Checksum" \
--text="$md5"
} | zenity --progress \
--auto-close \
--auto-kill \
--pulsate \
--title="${0##*/}" \
--text="Computing checksum"
Run Code Online (Sandbox Code Playgroud)
对于实际的进度条,您需要提前知道要处理的文件数量。
和zsh:
#! /bin/zsh -
export LC_ALL=C
autoload zargs
cd /path/to/dir || exit
{
files=(.//**/*(ND.))
} > >(
zenity --progress \
--auto-close \
--auto-kill \
--pulsate \
--title=$0:t \
--text="Finding files"
)
md5=(
$(
zargs $files -- md5sum \
> >(
awk -v total=$#files '/\/\// {print ++n * 100 / total}' | {
zenity --progress \
--auto-close \
--title=$0:t \
--text="Computing checksum" || kill -s PIPE $$
}) \
| md5sum
)
)
zenity --info \
--title=$0:t \
--text="MD5 sum: $md5[1]"
Run Code Online (Sandbox Code Playgroud)
请注意,在语言环境之外C,至少在 GNU 系统上,文件名顺序是不确定的,因为某些字符排序相同,并且文件名不能保证由有效文本组成,因此如上所述LC_ALL=C。
C 语言环境顺序也非常简单(基于字节值),并且在不同系统和版本之间都是一致的。
请注意,这意味着错误消息(如果有)将以英语显示,而不是用户的语言(但 、Computing checksum等Finding files也没有本地化,所以也没关系)。
对您的方法的一些其他改进:
-exec md5sum {} +or -print0 | xargs -r0 md5sum(或zargs等效项)可最大限度地减少调用次数md5sum,每次md5sum调用都会传递多个文件。-exec md5sum {} \;意味着md5sum每个文件运行一个,效率非常低。md5sum。一般来说,这样做sort -k2不起作用,因为文件名可以包含换行符。一般来说,基于行处理文件路径是错误的。您会注意到我们.//在 zsh 方法中使用前缀来awk能够可靠地计算文件。某些md5sum实现还提供-zNUL 分隔记录的选项。