我想用文件夹中的所有.txt文件(recursion地)包含“321”来代替所有“123”的实例。 我想过这样做
sed -i 's/123/321/g' | find . -name \*.txt
但在可能搞砸我所有的文件之前,我想问问它是否会工作。
你有sed
和find
回到前面。 使用GNU sed
和-i
选项,您可以使用:
find . -name '*.txt' -type f -exec sed -is/123/321/g {} +
find
找到扩展名为.txt
文件,并在它们的组上运行sed -i
命令(这是最后的+
;它在POSIX 2008中是标准的,但不是所有版本的find
必须支持它)。 在这个例子中, s/123/321/g
命令没有被误解的危险,所以我没有用引号括起来。 但是,为了简单和安全起见,尽可能将sed
脚本放在单引号中。
你也可以使用xargs
(并再次使用GNU扩展-print0
来find
和-0
和-r
到xargs
):
find . -name '*.txt' -type f -print0 | xargs -0 -r sed -i 's/123/321/g'
-r
表示'不运行,如果没有参数'(所以找不到任何东西)。 -print0
和-0
工作,生成以C空字节'\0'
结尾而不是换行符结尾的文件名,避免误解包含换行符,空格等的文件名。
请注意,在真实数据上运行脚本之前,您可以并且应该对其进行测试。 制作一个虚拟目录(我通常称之为junk
),将一些示例文件复制到垃圾目录中,将目录更改为垃圾目录,然后在这些文件上测试脚本。 既然他们是副本,如果出了什么问题就没有什么坏处。 然后你可以简单地删除目录中的所有内容: rm -fr junk
不应该让你痛苦。