标题:Linux ~ find: 如何在-exec参数中使用sed命令并重定向输出到某个文件 出处:Felix021 时间:Mon, 16 Feb 2009 10:54:14 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?1465 内容: @ 2010-08-20 BS一下不看manpage的自己 引用 $ man sed ... -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) ... 也就是说,只需要用 sed -i 就可以直接替换文件中的内容 ======以前的分割线====== 要用sed批量修改文件的内容,但是用这个命令解决不了问题: find -name "*.php" -exec sed -e 's/aaa/bbb/' {} > {} \; 因为bash把 > 解释为find命令输出的重定向。 修改一下: find -name "*.php" -exec sed -e 's/aaa/bbb/' {} \> {} \; 还是不行,因为 sed 去寻找一个名为 > 的文件进行处理 再修改: find -name "*.php" -exec "sed -e 's/aaa/bbb/' {} \> {} " \; 还是不行,因为find去找一个名为 "sed -e 's/aaa/bbb/' {} \> {} " 的程序来执行 那是囧之又囧阿。于是去baidu,去google, 但是无论baidu还是google "find -exec 重定向" 都搜不到相应的解决方案,这样的问题居然没有人遇到过? 于是用google搜了一下引用 linux find using "-exec" sed redirect 搜到了这一页: http://www.loisch.de/linux.html 看来还是国人太ooxx了,sigh。 解决方案其实很简单:绕个弯,把 -exec 的命令给shell来执行 注意:下面的命令一定不要在有用的文件上直接尝试!!!!!! 引用 find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}" \; 哦也!没有错误提示了! 然后 ls -al 一下,爽!所有文件大小都变成 0 了! 为什么捏?那篇文章里面解释了: 因为bash检测到需要重定向到那个文件,所以事先把那个文件清空了。 那篇文章里面提到一个修改bash配置的解决方案,但是不通用,建议还是用他说的第二种方案: 引用 find -name "*.php" -exec bash -c "sed -e 's/aaa/bbb/' {} > {}.tmp; mv -f {}.tmp {}" \; 嘿,这下爽了! Generated by Bo-blog 2.1.0