如何使用termianl在linux中使用相同的文件名(例如:data.txt)更改所有子目录中的字符串?

时间:2017-03-09 12:27:27

标签: linux ubuntu

find . -name "data.txt" -print0 | grep -rl "pa028" ./ |xargs -0 sed -i '' -e 's/pa028/pa014/g'

我尝试用文件名中的pa014替换pa028" data.txt"在所有子目录中。你能找到请纠正我吗?

1 个答案:

答案 0 :(得分:0)

您不能将grep放在find -print0xargs -0之间,因为grep对行进行操作,并且此管道包含空值分隔的文本而不是行。此外,grep -r .会忽略您设置find生成的标准输入。

find . -name "data.txt" -exec grep -q "pa028" {} \; -print0 |
xargs -r -0 sed -i '' -e 's/pa028/pa014/g'

这里的逻辑是使用-exec grep -q作为find的谓词,因此我们生成一个以空值终止的匹配文件列表(-exec返回true)以传递给{ {1}}。 (xargs -r -0选项也很重要;如果-r仍在运行,即使xargs没有产生输出,也会出现奇怪的错误。)

GNU find有一个扩展,用grep操作以空字符结尾的字符串,并用-z打印以空字符结尾的文件名,但这是一个相当近期的开发,所以我还没准备好推荐。