find . -name "data.txt" -print0 | grep -rl "pa028" ./ |xargs -0 sed -i '' -e 's/pa028/pa014/g'
我尝试用文件名中的pa014替换pa028" data.txt"在所有子目录中。你能找到请纠正我吗?
答案 0 :(得分:0)
您不能将grep
放在find -print0
和xargs -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
打印以空字符结尾的文件名,但这是一个相当近期的开发,所以我还没准备好推荐。