使用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
相关产品推荐
相关产品推荐

