我有一个只写数据的脚本stdout.我需要为多个文件运行它并为每个输入文件生成不同的输出文件,我想知道如何使用find -exec它.所以我基本上尝试了几种变体(我cat为了可测试性而替换了脚本):
find * -type f -exec cat "{}" > "{}.stdout" \;
Run Code Online (Sandbox Code Playgroud)
但由于所有数据都被写入一个字面命名的文件,因此无法使其正常工作{}.stdout.
最终,我可以使用它:
find * -type f -exec sh -c "cat {} > {}.stdout" \;
Run Code Online (Sandbox Code Playgroud)
但是,虽然这个最新的形式适用cat,我的脚本需要通过几个初始化脚本加载环境变量,因此我最终得到:
find * -type f -exec sh -c "initscript1; initscript2; ...; myscript {} > {}.stdout" \;
Run Code Online (Sandbox Code Playgroud)
这似乎是浪费,因为我已经在我当前的shell中初始化了所有内容.
有没有更好的方法来做到这一点find?欢迎其他单行.
小智 13
你可以用eval做到这一点.它可能很难看,但是必须为此制作一个shell脚本.此外,这一切都在一条线上.例如
find -type f -exec bash -c "eval md5sum {} > {}.sum " \;
Run Code Online (Sandbox Code Playgroud)
一个简单的解决方案是在脚本周围放置一个包装器:
#!/bin/sh
myscript "$1" > "$1.stdout"
Run Code Online (Sandbox Code Playgroud)
调用它myscript2并使用find调用它:
find . -type f -exec myscript2 {} \;
Run Code Online (Sandbox Code Playgroud)
请注意,虽然find的大多数实现允许您执行您已完成的操作,但从技术上讲,如果您{}在参数列表中使用多次,则未指定查找的行为-exec.