我想弄清楚什么是最快的方法来返回其内容与多个字符串中的任何一个匹配的所有文件名。我正在使用 xargs 进行迭代。
$ cat ../Identifiers.list | xargs -i grep -l "{}" .
打印所有文件名大约需要 8 分钟。有没有更快的方法?
Identifiers.list - 文件内容如下
287434
383460
633491
717255
827734
253735
635373
553888
910366
目录中的文件数 - 36000
$ ls -l *.xml | wc -l
36000
最佳答案
我会反过来做:
printf '%s\0' *.xml | xargs -0 grep -lFf ../Identifiers.list
这将只检查每个文件一次,并在找到匹配项后立即停止。 -F
使用固定字符串匹配而不是正则表达式,这应该会进一步加快速度。
我认为你的方法隐含地使用了 -L 1
(因为 -i
),所以对于 Identifier.list
的每一行,它遍历所有文件。
并行化可能会更快,例如使用四个并行进程:
printf '%s\0' *.xml | xargs -0 -P 4 grep -lFf ../Identifiers.list
如果您的文件是 ASCII 文件,您可以使用 LC_ALL=C
以提高速度:
printf '%s\0' *.xml | LC_ALL=C xargs -0 -P 4 grep -lFf ../Identifiers.list
不过,使用 xargs
是个好主意,即使没有并行化:直接使用 grep,如
grep -lFf ../Identifiers.list *.xml
可能会引发错误,因为 *.xml
扩展为太长的命令行。
关于linux - 列出其内容可以与多个字符串中的任何一个匹配的所有文件名的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54486454/