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

