我有一个由数百个目录组成的数值模拟的结果;每个目录包含数百万个文本文件。
我需要替换字符串"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将并行运行机器上有多少核就运行多少作业。
更复杂的用途包括远程服务器和文件传输(参见这里和此处的备查表)。