如何在 bash 中并行解压缩存档中的某些文件和 grep

how to untar certain files from an archive and grep in parallel in bash

我们有大量的压缩包,在每个压缩包中,我只需要在一些已知名称的文件中搜索特定模式。

由于磁盘访问速度较慢,并且此系统上有相当多的内核和大量可用内存,我们的目标是尽量减少磁盘写入并尽可能多地通过内存。

echo "a.txt" > file_subset_in_tar.txt
echo "b.txt" >> file_subset_in_tar.txt
echo "c.txt" >> file_subset_in_tar.txt
tarball_name="tarball.tgz";
pattern="mypattern"
echo "pattern: $pattern"

(parallel -j-2 tar xf $tarball_name -O ::: `cat file_subset_in_tar.txt` | grep -ac "$pattern")

这直接在 bash 终端上工作得很好。但是,当我将其粘贴到顶部带有 bash bang 的脚本中时,它只打印零。

如果我将 $pattern 更改为硬编码字符串,它运行正常。感觉管道排序或类似问题有问题。因此,理想情况下,对上述尝试的更新或满足上述 disk/memory 使用要求的其他解决方案将不胜感激。

我认为您的 parallel 命令构造不正确。您可以 运行 命令管道,如下所示:

parallel -j -2 "tar xf $tarball_name -O {} | grep -ac $pattern" :::: file_subset_in_tar.txt

另请注意,反引号和 cat 的使用是不必要的,可以使用 ::::.

从文件中将参数提供给 parallel