You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用find与sha256sum生成SHA-256哈希时输出文件被误纳入输入列表的问题

解决find命令包含输出文件的问题

这个问题的根源很好理解:当你运行这个函数时,shell会先执行重定向操作——也就是提前创建(或清空)$1/hashedoutput.sha256文件,然后才启动find命令遍历目录。这时候find会把这个刚生成的输出文件也当作目标文件,自然就把它的哈希也写进去了。

给你几个靠谱的解决方案,按需选择:

方案1:直接排除输出文件(最简单)

在find命令里添加一个排除条件,明确跳过hashedoutput.sha256文件。修改后的函数如下:

gen_sha256sum () {
  find "$1" -maxdepth 1 -type f ! -name "hashedoutput.sha256" -exec sha256sum {} + > "$1/hashedoutput.sha256"
}

这里的! -name "hashedoutput.sha256"表示「匹配文件名不是hashedoutput.sha256的文件」,完美避开我们自己生成的输出文件。注意!前后的空格不能少,否则shell会解析错误。

方案2:先收集文件列表再处理(更健壮)

如果担心以后修改输出文件名,或者需要处理带空格、特殊字符的文件名,推荐先把要处理的文件列表存到临时文件里,再计算哈希。这种方法不会受输出文件创建的影响:

gen_sha256sum () {
  # 创建临时文件
  local temp_file=$(mktemp)
  # 用null分隔符收集所有目标文件(避免特殊字符问题)
  find "$1" -maxdepth 1 -type f -print0 > "$temp_file"
  # 从临时文件读取文件列表计算哈希
  sha256sum --files0-from="$temp_file" > "$1/hashedoutput.sha256"
  # 清理临时文件
  rm "$temp_file"
}

-print0和--files0-from是一对黄金搭档,能安全处理包含空格、换行符甚至特殊符号的文件名,比方案1的兼容性更强。

方案3:把输出文件放在目标目录外(最省事)

如果允许输出文件不在目标目录里,直接把它放到上级目录或者其他位置,find自然不会遍历到它:

gen_sha256sum () {
  find "$1" -maxdepth 1 -type f -exec sha256sum {} + > "$1/../hashedoutput.sha256"
}

这种方法不用修改find的过滤逻辑,但缺点是输出位置固定,灵活性稍差。

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 06:34:11