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

