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

使用find的-exec批量处理.tex文件失败,能否替代xargs实现?

如何用find的-exec替代xargs实现Perl批量文本替换?

我尝试执行以下命令,但无法正常运行:

find . -name '*.tex' -exec 'perl -0777 -pi -e "s/\%\%if.+?\%\%fi//g"' {} \;

得到的错误信息为:

find: ‘perl -0777 -pi -e "s/\\%\\%if.+?\\%\\%fi//g" ./colophon.tex’: No such file or directory
find: ‘perl -0777 -pi -e "s/\\%\\%if.+?\\%\\%fi//g" ./glossary.tex’: No such file or directory

而以下使用xargs的命令可以正常运行:

find . -name '*.tex' -print0 | xargs -n1 -0 perl -0777 -pi -e "s/\%\%if.+?\%\%fi//gs"

请问是否可以使用-exec替代xargs实现该功能?


当然可以,你之前的-exec命令报错是因为错误地将整个perl命令及参数用单引号括起来,find会把这个带参数的字符串当成一个单独的可执行文件去查找,自然找不到对应路径。

正确的-exec写法需要把命令和参数拆分,不要用外层单引号包裹整个perl调用,直接指定命令和参数,把{}作为文件名占位符即可:

1. 逐个处理文件(对应xargs -n1的行为)

find . -name '*.tex' -exec perl -0777 -pi -e 's/\%\%if.+?\%\%fi//gs' {} \;
  • {} \;表示对每个匹配到的.tex文件单独执行一次perl命令

2. 批量处理文件(更高效,对应xargs默认行为)

find . -name '*.tex' -exec perl -0777 -pi -e 's/\%\%if.+?\%\%fi//gs' {} +
  • {} +表示把所有匹配到的文件一次性传给perl命令,减少进程启动次数,效率更高

两种写法都能实现和xargs命令相同的文本替换效果,推荐使用第二种批量处理的方式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:33:20