一尘不染

使用find -exec重定向stdout而不创建新的shell

linux

我有一个仅向写入数据的脚本stdout。我需要为多个文件运行它,并为每个输入文件生成一个不同的输出文件,我想知道如何使用find -exec它。因此,我基本上尝试了几种变体(cat出于测试目的,我将脚本替换为):

find * -type f -exec cat "{}" > "{}.stdout" \;

但由于所有数据都被写入了名为的文件中,因此无法正常工作{}.stdout

最终,我可以使用它:

find * -type f -exec sh -c "cat {} > {}.stdout" \;

但是,尽管这种最新形式可以很好地使用cat,但我的脚本需要通过多个初始化脚本加载环境变量,因此我最终得到了:

find * -type f -exec sh -c "initscript1; initscript2; ...;  myscript {} > {}.stdout" \;

这似乎很浪费,因为我已经在当前shell中初始化了所有内容。

有更好的方法find吗?其他单线也欢迎。


阅读 208

收藏
2020-06-02

共1个答案

一尘不染

一个简单的解决方案是在脚本周围放一个包装器:

#!/bin/sh

myscript "$1" > "$1.stdout"

调用它myscript2并使用find调用它:

find . -type f -exec myscript2 {} \;

请注意,尽管大多数find的实现都允许您执行已做的事情,但是如果您{}在的参数列表中多次使用find的行为,从技术上讲,其行为是不确定的-exec

2020-06-02