如何grep大量文件?

Upendra

我正在尝试grep在当前目录中保存40k个文件,但出现此错误。

for i in $(cat A01/genes.txt); do grep $i *.kaks; done > A01/A01.result.txt
-bash: /usr/bin/grep: Argument list too long

通常如何处理grep数千个文件?

谢谢Upendra

大卫·W

这让大卫感到难过...

到目前为止,每个人都是错误的(anubhava除外)。

Shell脚本与任何其他编程语言都不一样,因为对行的大部分解释来自Shell在实际执行命令之前对它们进行插值的功能。

让我们做一些简单的事情:

$ set -x
$ ls
+ ls
bar.txt foo.txt fubar.log
$ echo The text files are *.txt
echo The text files are *.txt
> echo The text files are bar.txt foo.txt
The text files are bar.txt foo.txt
$ set +x
$

set -x让你看到的外壳实际上是如何插值的水珠,然后通过该回命令输入。>指向实际上正在由命令执行的行。

您会看到该echo命令没有解释*相反,shell抓取*并将其替换为匹配文件的名称。然后并且只有这样,该echo命令才实际执行该命令。

当你有40K加的文件,你这样做grep *,你就扩大这*对那些40000个加文件的名称之前grep甚至有执行的机会,而这也正是该错误消息的/ usr /斌/ grep的:参数列表过长是来自(哪里。

幸运的是,Unix可以解决这个难题:

$ find . -name "*.kaks" -type f -maxdepth 1 | xargs grep -f A01/genes.txt

find . -name "*.kaks" -type f -maxdepth 1会发现所有的*.kaks文件,并且-depth 1将只包括在当前目录下的文件。-type f确保你只拿起文件,而不是一个目录。

find命令通过管道将文件转换成的名称xargsxargs将附加文件的名称grep -f A01/genes.txt命令。但是,xargs有套它的把戏。它知道命令行缓冲区有多长时间,并grep在命令行缓冲区已满时执行,然后将另一个系列的文件传递给grep这样,grep可能执行了三到十次(取决于命令行缓冲区的大小),并且所有文件都已使用。

不幸的是,xargs使用空格作为文件名的分隔符。如果您的文件包含空格或制表符,则您将遇到麻烦xargs幸运的是,还有另一个解决方法:

$ find . -name "*.kaks" -type f -maxdepth 1 -print0 | xargs -0 grep -f A01/genes.txt

-print0将导致find打印出文件名,这些文件名不是用换行符而是NUL字符分隔的。-0为参数xargs告诉xargs该文件分隔符不是空白,但NULL字符。因此,解决了该问题。

您也可以这样做:

$ find . -name "*.kaks" -type f -maxdepth 1 -exec grep -f A01/genes.txt {} \;

这将对grep找到的每个文件执行,而不是对xargs只能grep在命令行中填充的所有文件执行操作并且仅对其运行这样做的好处是,它完全避免了外壳的干扰。但是,它可能会或可能不会效率较低。

有趣的是进行试验,看看哪种效率更高。您可以time用来查看:

$ time find . -name "*.kaks" -type f -maxdepth 1 -exec grep -f A01/genes.txt {} \;

这将执行命令,然后告诉您花费了多长时间。-exec和一起尝试xargs,看看哪个更快。让我们知道你发现了什么。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何grep大量文件?

来自分类Dev

从大型文件中获取大量Grep模式

来自分类Dev

如何使用find + grep + sed + xargs或其他方式大量重命名文件

来自分类Dev

如何串联大量文件

来自分类Dev

如何访问大量共享文件?

来自分类Dev

如何在大量文件中使用grep来在几分钟内搜索字符串并获取结果

来自分类Dev

如何从文件中删除大量行

来自分类Dev

如何快速浏览Emacs中的大量文件?

来自分类Dev

如何快速浏览Emacs中的大量文件?

来自分类Dev

如何防止Debian上的大量文件删除

来自分类Dev

如何对大量文件重新编号?

来自分类Dev

ffmpeg - 如何并行转换大量文件?

来自分类Dev

大量文件

来自分类Dev

如何打开grep生成的文件?

来自分类Dev

如何从文件grep以下几行?

来自分类Dev

如何保存grep多个文件

来自分类Dev

如何从大量文件中删除某些特定文件

来自分类Dev

为grep输出上下文(-C)会生成大量文件

来自分类Dev

如何通过读取CSV文件来保留大量数据

来自分类Dev

如果AIX(ksh)中有大量文件,rm *如何工作

来自分类Dev

如何使用查找-exec和Tr处理大量文件

来自分类Dev

如何重命名Hadoop / Spark中的大量文件?

来自分类Dev

如何在Eclipse中浏览大量文件而不打开它们

来自分类Dev

如何最好地通过scp复制大量小文件?

来自分类Dev

如何最好地通过scp复制大量小文件?

来自分类Dev

如何在Windows中提取大量GZ文件

来自分类Dev

如何从github检索大量pom.xml文件?

来自分类Dev

如何以响应方式撤消TFS中的大量文件

来自分类Dev

如何使用命令行删除大量的._文件