Shell 是不是;grep“;它最多可以处理多少个文件?
我只是跑:Shell 是不是;grep“;它最多可以处理多少个文件?,shell,unix,command-line,grep,cat,Shell,Unix,Command Line,Grep,Cat,我只是跑: grep "" *.txt > out.txt 在1500个文件上。输出只包括几百个文件。。为什么? 使用时: cat *.txt > out.txt 这是可行的,但我希望文件名作为行名 谢谢大家! 我建议使用: ls -l *.txt | cut -b 51- 另外,*.txt在被传递到cat或grep之前,由终端进行扩展。因此,理论上,可以传递给命令的文件参数数量是有限制的 ls-l*.txt提供目录中的文件列表 |是一个管道,意味着您可以将上一个命令
grep "" *.txt > out.txt
在1500个文件上。输出只包括几百个文件。。为什么?
使用时:
cat *.txt > out.txt
这是可行的,但我希望文件名作为行名
谢谢大家! 我建议使用:
ls -l *.txt | cut -b 51-
另外,*.txt
在被传递到cat
或grep
之前,由终端进行扩展。因此,理论上,可以传递给命令的文件参数数量是有限制的
提供目录中的文件列表ls-l*.txt
是一个管道,意味着您可以将上一个命令的输出传递到下一个命令|
意味着您切断了前50个字节,这将为您提供文件名cut-b51-
cat*.txt>out
中吗?除非您正好处于每个命令的最大字符数的边缘,否则这不会产生任何影响。试试这个:
ls -1 | egrep '\.txt$' | xargs egrep "" /dev/null > out
ls-1
列出目录中的所有文件,每行一个文件名,第一个egrp
只过滤掉以“.txt”结尾的文件。这样,您就不必担心在列出文件时命令行长度会用完xargs
读取stdin
,直到它在xargs
的其他参数之后,在单个命令行上获得尽可能多的行。然后,它调用您提供的命令,以及您为该组输入参数提供的选项xargs
然后重复该过程,直到用完您提供的所有参数。每次调用最终的egrep
都会写入相同的stdout
,因此所有输出都会进入同一个文件
/dev/null
在xargs
只找到一行输入的情况下存在(例如,因为您只有一个文件,或者捆绑文件时,最后一个捆绑包只有一个文件)。如果使用单个文件调用egrep
,则不会打印文件名。由于您明确表示需要文件名,因此告诉egrep
搜索/dev/null
可以保证始终至少有两个文件。由于/dev/null
保证为空,因此您将永远无法在其中找到任何内容,并且它也不会显示在您的输出中
xargs
适用于find
。如果要在当前目录及其子目录中的所有“.txt”文件中搜索“foo”:
find . -name "*.txt" -print | xargs egrep foo /dev/null
我会成功的。如果文件名中有空格,它们将不会被引用,egrep
将被混淆,因此请使用find
上的-print0
选项和xargs上的-0
选项:
find . -name "*.txt" -print0 | xargs -0 egrep foo /dev/null
@用户2966591我刚刚添加了一个解释。然而,鲁本斯的回答在这里要优雅得多:非常好!我要做的是将文件名作为一列包含在新文件中。但是现在我可以使用这个和cat命令,然后合并它们。谢谢等等,这不起作用,因为在1500个文件中,每个文件都有不止一行!我想要一个列,告诉我它来自哪个文件。你收到错误消息了吗?grep有多种实现方式grep;
grep--version
是否打印有用的内容?所有的*.txt
文件都是文本文件吗?grep(BSD grep)2.5.1-FreeBSD。是的,它们都是同一类型的。没有错误。有些文件是空的,这有关系吗?空文件不会有任何区别。试试这个:ls*.txt | wc-l;grep”“*.txt | wc-l;cat*.txt | wc-l
——第一个应该告诉您有多少*.txt
文件;第二个和第三个应该给出相同的结果,我得到三个值:14522181634。第一个是文件数。另一个是什么?如果将-H
标志添加到egrep
,则可以删除/dev/null
参数。@iscfrc是一个很好的提示。几年前,我在一个没有-H的grep版本上学会了/dev/null技巧。