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

如何让Bash的find -exec直接执行命令而不使用临时文件?

问题:find直接执行命令出现“文件未找到”错误怎么解决?

原可正常运行的脚本

以下脚本会遍历./build/html目录下所有.html文件,生成临时脚本emojize_commands.sh,执行该临时脚本可完成emoji替换操作:

find ./build/html -name '*.html' \( -exec echo ../emojize_pngorsvg.py \"{}\" \> \"{}.emojized\" \&\& rm \"{}\" \&\& mv \"{}.emojized\" \"{}\" >> ../emojize_commands.sh \; \)
cat ../emojize_commands.sh
chmod +x ../emojize_commands.sh
../emojize_commands.sh

临时脚本内容示例:

../emojize_pngorsvg.py "./build/html/Home/Technical/Guides/Windows/Force-activate-a-Windows-evaluation/index.html" > "./build/html/Home/Technical/Guides/Windows/Force-activate-a-Windows-evaluation/index.html.emojized" && rm "./build/html/Home/Technical/Guides/Windows/Force-activate-a-Windows-evaluation/index.html" && mv "./build/html/Home/Technical/Guides/Windows/Force-activate-a-Windows-evaluation/index.html.emojized" "./build/html/Home/Technical/Guides/Windows/Force-activate-a-Windows-evaluation/index.html"
# 更多类似执行行

修改后的问题脚本

为移除临时文件,直接让find执行命令,修改后的脚本如下:

find ./build/html -name '*.html' \( -exec ../emojize_pngorsvg.py \"{}\" \> \"{}.emojized\" \&\& rm \"{}\" \&\& mv \"{}.emojized\" \"{}\" \; \)

但运行时出现大量“文件未找到”错误。

原因及解决方法

错误原因

find的-exec参数默认仅将第一个命令(这里是../emojize_pngorsvg.py)识别为可执行程序,后面的重定向符号>、逻辑运算符&&、rm、mv都会被当作该Python脚本的参数传递,而非交给Shell解析执行,因此会触发“文件未找到”错误。

正确写法

需要将整个命令序列交给Bash解析执行,使用-exec bash -c '命令序列'的形式,同时正确传递文件名参数:

单文件处理版本

find ./build/html -name '*.html' -exec bash -c '../emojize_pngorsvg.py "$1" > "$1.emojized" && rm "$1" && mv "$1.emojized" "$1"' _ {} \;
  • bash -c '...':调用Bash执行引号内的命令序列
  • _:作为Bash的$0占位符(无实际作用,仅为填充参数位置)
  • {}:find将找到的文件名传递给Bash的$1位置参数
  • 用双引号包裹$1,避免文件名含空格、特殊字符时出错

批量优化版本

如果文件数量较多,使用+代替;,让find一次性传递多个文件名给Bash,减少进程创建开销,提升效率:

find ./build/html -name '*.html' -exec bash -c '
for file do
  ../emojize_pngorsvg.py "$file" > "$file.emojized" && rm "$file" && mv "$file.emojized" "$file"
done
' _ {} +

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 06:05:53