列出我用sed替换的文件

时间:2014-11-05 09:20:06

标签: replace sed

我有命令

find . -type f \( ! -name "*.png" \) -print0 | \
xargs -0 sed -i 's#word#replace#g'

awk/sed: How to do a recursive find/replace of a string?
BASH: recursive program to replace text in a tree of files

此命令到目前为止有效,但我想显示sed替换文本的文件。 是否有一些允许的参数?

3 个答案:

答案 0 :(得分:2)

您可以同时使用print和exec选项并打印出它处理的文件:

find . -type f \( ! -name "*.png" \) -print -exec sed -i 's#word#replace#g' {} \; 2>/dev/null

答案 1 :(得分:0)

您缺少cmp来比较更改前后的两个文件。你可以尝试这些方面的东西:

find . -type f \( ! -name "*.png" \) -exec sh -c 'sed "s/word/replace/g" $0 > $0.$$; if ! cmp $0.$$ $0; then echo $0; mv $0.$$ $0; else rm $0.$$; fi' {} \;
  • find - 在当前目录中,所有文件名称都不像* .png
  • exec - 通过查找命令找到的文件中的相关单词搜索并替换单词,并将其放入由进程id附加的临时文件中
  • if!cmp statement - 比较新旧文件,如果它们不相同则打印文件名和输出,最后将临时文件移动到原始文件(如果它们不相同),否则删除临时文件。

答案 2 :(得分:0)

我不知道你在哪个平台,但这是可能的。更改你的xargs以运行一个shell,这样你就可以执行多个命令然后在shell中,测试文件是否比你在开始时创建的任意文件更新 - 即它被更改

touch /tmp/go
find ... | xargs ... -I % sh -c 'sed "%"; [ "%" -nt /tmp/go ] && echo %'