Bash脚本根据文件名找到文件,并做搜索替换它们

问题描述:

我有一堆文件(具有相同的名称,说abc.txt)遍布整个网络文件系统。Bash脚本根据文件名找到文件,并做搜索替换它们

我需要递归搜索这些文件中的每一个,一旦找到每一个文件,都要进行内容搜索并替换它们。

经过一番研究,我发现我可以使用find命令找到这些文件(用-r来递归吧?)。喜欢的东西:

find . -r -type f abc.txt 

而且用sed来已经找到并在每一个取代:

sed -ie 's/search/replace/g' abc.txt 

但我不知道如何粘上两个在一起,使我找到ABC的所有地方。 txt,然后在每一个上进行搜索/替换。

我的目录树非常大,所以我知道通过所有目录的递归搜索需要很长时间,但是这比手动尝试查找每个文件要好。

我在使用Bash的OSX 10.6上。

谢谢大家!

更新:我认为下面发布的答案可能适用于其他操作系统(Linux也许),但对于OSX,我不得不稍微调整它。

find . -name abc.text -exec sed -i '' 's/search/replace/g' {} + 

在sed中指定我们不想生成备份文件后,似乎需要空引号。此手册页上写着:

-i扩展:就地

编辑文件,保存与指定的扩展备份。如果给定零长度扩展,则不会保存备份。

find . -r -type f abc.txt -exec sed -i -e 's/search/replace/g' {} + 
+3

只有缺少的是'-exec'子句末尾的'\;'或'+ ... ...并且复制了原始海报使用的'-ie'而不是'-i -e '可能会产生意想不到的效果,因为前者将'e'指定为用于备份的文件扩展名。 –

+0

已更新。感谢您的评论。 –

+0

谢谢amit_g!除了最终结局之外,所有这一切都很清楚。 {} +最后做了什么? – nube