将 GNU sed 与 GNU find 一起使用时如何加速替换?

How to accelerate substitution when using GNU sed with GNU find?

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

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

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

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

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

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

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

总结:

谢谢

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 并行将 运行 与机器上并行的内核一样多的作业。

更复杂的用途可能涉及远程服务器和文件传输,请参阅 here and a cheatsheet here