如何在find -exec中重定向grep命令的输出结果?
解决find结合grep重定向输出的问题
正确命令写法
如果需要预先清空目标文件(避免残留旧内容),可以执行:
> file1 && > file2 && find ./Documents/ -type f \( -name "*.out" -o -name "*.err" \) -exec sh -c 'grep "out" "$1" >> file1; grep "err" "$1" >> file2' sh {} \;
如果不需要清空旧内容,直接用追加模式写入:
find ./Documents/ -type f \( -name "*.out" -o -name "*.err" \) -exec sh -c 'grep "out" "$1" >> file1; grep "err" "$1" >> file2' sh {} \;
错误原因分析
- 参数顺序错误:你原来的
grep out > file1 {}写法颠倒了重定向和文件参数的位置,grep的标准语法是grep 模式 目标文件,重定向必须放在命令末尾,否则grep会把file1当作要搜索的文件,{}变成无效参数,自然搜不到内容。 - 覆盖模式导致空文件:用
>会每次覆盖目标文件,若最后处理的几个文件没有匹配结果,最终文件就会被清空成空文件,必须用>>以追加模式写入,保留每次grep的结果。 - 文件名引用不规范:在
sh -c脚本中用$1明确引用传递的文件名,前面的sh是脚本的$0占位符,能避免文件名含空格、特殊字符时出现异常。
内容的提问来源于stack exchange,提问作者user20277987
相关产品推荐
相关产品推荐

