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
    提供目录中的文件列表
  • |
    是一个管道,意味着您可以将上一个命令的输出传递到下一个命令
  • cut-b51-
    意味着您切断了前50个字节,这将为您提供文件名

您确定所有文件都显示在
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技巧。