linux - 列出其内容可以与多个字符串中的任何一个匹配的所有文件名的最快方法

标签 linux bash shell unix xargs

我想弄清楚什么是最快的方法来返回其内容与多个字符串中的任何一个匹配的所有文件名。我正在使用 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/

相关文章:

linux - 什么时候应该在 bool 条件下将变量放在引号中?

linux - 有没有办法在 bash 中执行 Linux ifup 或 ifdown 而不必总是先输入 sudo?

shell - 不阻塞地读取可选标准输入

linux - 转储失败,因为无法加载 Assets

linux - 在流程调用之间传输数据

regex - 使用 sed 在 '.' 之前用 '_' 替换所有出现的 '='

ruby-on-rails - 在 MRI 和 jruby 之间切换的 Shell 脚本

git - Jenkins : how to use Credentials Binding Plugin to Execute Windows Batch Command

linux - bash 中出现意外的文件结尾错误

linux - Linux内核代码的哪一部分负责实现LRU?