Replace 使用xargs sed查找和替换-我可以将结果保存到文件中吗?

Replace 使用xargs sed查找和替换-我可以将结果保存到文件中吗?,replace,sed,find,grep,xargs,Replace,Sed,Find,Grep,Xargs,我的代码将“foo”的所有实例替换为“bar”: find . -type f | xargs grep 'foo' -l | xargs sed -i 's|foo|bar|g' 我想将修改过的文件列表保存到文本文档中。可能吗 编辑: 这是最后一个对我有用的代码: find . -type f -print0 | xargs -0 grep 'foo' -l | tee result.txt | xargs -0 sed -i 's|foo|bar|g' 不确定这是否是最快的方法,但对于几

我的代码将“foo”的所有实例替换为“bar”:

find . -type f |
xargs grep 'foo' -l |
xargs sed -i 's|foo|bar|g'
我想将修改过的文件列表保存到文本文档中。可能吗

编辑:

这是最后一个对我有用的代码:

find . -type f -print0 |
xargs -0 grep 'foo' -l |
tee result.txt |
xargs -0 sed -i 's|foo|bar|g'

不确定这是否是最快的方法,但对于几千个文件来说,这种方法与其他建议的方法在速度上的差异可能很小。

看起来像是对
xargs
的无用使用,通常与
find
结合使用

find . -type f -exec grep 'foo' -l {} ";" -exec sed -i 's|foo|bar|g' {} ";" -ls > file.lst
小心使用,因为我没有测试它。我不确定您是想更改文件名列表还是文件内容。由于您使用
grep
sed
进行搜索,我认为仅使用
sed
就足够了:

find . -type f -exec sed -i 's|foo|bar|g' {} ";" -ls > file.lst

我只想修改内容,不想修改文件名。唯一需要修改的文件是那些包含字符串的文件。我要补充的是,有成千上万的文件正在被搜索和修改。在这方面exec比xargs好吗?xargs是一个额外的过程,你不能用它做很多事情,用-exec做不到的事情更容易。Find知道结果的哪一部分是文件名,从哪里开始,从哪里结束。要安全地使用xargs,您必须对文件名中的空格、换行符和其他难看的内容进行清理(这在-print0中是可能的,但会使命令更大)。(但我必须在exec参数中添加2或3“;”。如果您的限制因素是HDD速度,我怀疑,那么使用并行调用没有多大用处。但即使并行调用也可以使用+而不是“;”。大约数千个文件:如果第一个“foo”接近文件末尾时,它被读取两次,一次由grep读取,一次由sed读取。如果没有“foo”,则在您的示例中完全由grep读取,在我的示例中完全由sed读取。如果“foo”很接近开头,你用grep读一点,完全用sed。我的方法是完全用sed。为什么sed比grep慢?好的,我认为你是对的。但是,我认为你的第二个例子会导致每个文件的修改日期发生变化,不管它是否包含“foo”。为什么不使用一个小的子集来测试计时?不是太小,但可能运行一分钟?如果您的数据不是非典型的,我不会期望有太大的差异。但是如果文件名包含空格、制表符、换行符等,您的代码将失败。您确定您的文件不包含此类内容吗?请跟随您的注释s我已经使用
print0
-0
修改了上面的代码,是的,但是使用xargs和类似的批处理方法肯定是一种很好的做法,因为当参数大小超过命令行限制时,名称(print0)中有空格或非典型字符,或者存在大量进程的风险(exec)分批而不是分批的。