如何并行对多个文件运行递归查找和替换操作?

Kur*_*tis 5 git parallel-processing bash sed find

我正在尝试使用 git filter-branch 功能替换 git 存储库中的文本数据。

我编写了一个简单的脚本来搜索各种术语并替换它们。它运行得非常慢。我执行了多行 BASH 代码来自定义搜索结果和替换操作。我知道我的代码效率不是很高。我决定继续尝试我的第一行,这应该是半效率的。浏览代码库仍然需要很长时间。

是否可以使用 BASH 或其他简单的方法来搜索我的文件并并行执行查找和替换操作以加快速度?

如果没有,是否有其他建议可以更好地处理这个问题?

这是我正在执行的 Git 命令:

git filter-branch --tree-filter "sh /home/kurtis/.bin/redact.sh || true" \
    -- --all
Run Code Online (Sandbox Code Playgroud)

这是我的命令实质上执行的代码:

find . -not -name "*.sql" -not -name "*.tsv" -not -name "*.class" \
    -type f -exec sed -i 's/01dPassw0rd\!/HIDDENPASSWORD/g' {} \;
Run Code Online (Sandbox Code Playgroud)

Jos*_*ner 4

git filter-branch 无法并行处理提交,因为它需要知道父提交的哈希(id)才能计算当前哈希。

但您可以加快每次提交的处理速度:

您的代码对每个文件执行 sed。那是非常慢的。使用这个代替:

find . -not -name "*.sql" -not -name "*.tsv" -not -name "*.class" \
       -type f -print0 \
  | xargs -0 sed -i 's/01dPassw0rd\!/HIDDENPASSWORD/g'
Run Code Online (Sandbox Code Playgroud)

这个版本的功能与您的版本完全相同,但 sed 是使用尽可能多的文件(参数)执行的。Find 的“-print0”和 xargs 的“-0”表示“用零字节分隔文件名”。因此,当文件名包含空格、换行符、二进制垃圾等时,不会有任何问题。

  • 要并行运行 sed,可以使用“xargs -0 -P count ...”。 (2认同)