如何在使用GNU sed和GNU find时加速替换?



我有一个由数百个目录组成的数值模拟的结果;每个目录包含数百万个文本文件。

我需要替换字符串"wavelength;";";wavelength_bc;";所以我尝试了以下两种方法:

find . -type f -exec sed -i 's/wavelength;/wavelength_bc;/g' {} ;

find . -type f -exec sed -i 's/wavelength;/wavelength_bc;/g' {} +

不幸的是,上面的命令需要很长时间才能完成(超过1小时)。

我想知道如何利用我的机器上的内核数量(8)来加速上面的命令?

我正在考虑使用xargs-P标志。我担心那样会损坏文件;所以我不知道这是否安全?

在简介:

  • 在使用find时如何加速sed替换?
  • 使用xargs -P并行运行是否安全?

谢谢你

使用xargs -P应该是安全的,但是您需要使用find-print0选项和管道到xargs -0来使用空格或通配符来地址文件名:

find . -type f -print0 |
xargs -0 -I {} -P 0 sed -i 's/wavelength;/wavelength_bc;/g' {}

xargs中的-P 0选项将以并行模式运行。它会在你的CPU上运行尽可能多的进程。

这可能适合您(GNU sed &平行):

find . -type f | parallel -q sed -i 's/wavelength;/wavelength_bc;/g' {}

GNU parallel将并行运行机器上有多少核就运行多少作业。

更复杂的用途包括远程服务器和文件传输(参见这里和此处的备查表)。

最新更新