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

使用find命令执行指令并将输出写入带追加扩展名的新文件问题

解决find -exec中重定向生成单一文件的问题

这个问题我太熟悉了!你遇到的核心问题是shell重定向的解析时机:原来命令里的> {}.nav是被你当前的shell提前解析的,而不是交给find的-exec逐个处理每个文件。所以所有command的输出都被写到了同一个名为{}.nav的文件里,而不是每个txt文件对应的.nav后缀文件。

正确的解决方案:用sh -c包裹命令

我们需要让每个文件的重定向操作在独立的shell进程中执行,这样每个文件都会生成对应的.nav文件。推荐两种写法:

写法1:逐个处理文件(适合少量文件)

find . -name "*.txt" -exec sh -c 'command -O -I "$1" > "$1".nav' sh {} \;
  • sh -c启动一个新的shell实例,执行后面的命令字符串
  • "$1"代表传递给这个shell的第一个参数(也就是find找到的目标文件路径)
  • 用双引号包裹"$1"是为了兼容带空格、特殊字符的文件名(比如my file.txt这种)
  • 最后的sh是给新shell的$0变量赋值(可以是任意字符串,习惯用sh占位)

写法2:批量处理文件(性能更优,适合大量文件)

如果你的txt文件数量很多,用+代替;可以减少启动shell的次数,提升效率:

find . -name "*.txt" -exec sh -c 'for f do command -O -I "$f" > "$f".nav; done' sh {} +

这个写法会把find找到的所有txt文件一次性传给shell,然后通过循环逐个处理,避免了频繁创建新进程的开销。

验证效果

当find返回./1/file1.txt和./2/file2.txt时,上面的命令会分别执行:

command -O -I ./1/file1.txt > ./1/file1.txt.nav
command -O -I ./2/file2.txt > ./2/file2.txt.nav

最终就会生成你期望的./1/file1.txt.nav和./2/file2.txt.nav文件啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:51:25