4

我刚跑:

grep ""  *.txt > out.txt 

在 1500 个文件上。输出只包含几百个文件。为什么?

使用时:

cat  *.txt > out.txt 

这可行,但我希望文件名作为行名。

谢谢!

4

2 回答 2

1

您确定所有文件都真正显示在 中cat *.txt > out吗?除非您正处于每个命令的最大字符数边缘,否则它应该不会产生影响。尝试这个:

ls -1 | egrep '\.txt$' | xargs egrep "" /dev/null > out

ls -1列出目录中的所有文件,每行一个文件名,第一个egrep过滤掉以“.txt”结尾的文件。这样,您不必担心列出文件时命令行长度不足。 xargs读取stdin,直到在xargs. 然后它调用您提供的命令,并使用您为该组输入参数提供的选项。 xargs然后重复该过程,直到用完您提供的所有参数。每次调用最终egrep写入相同的stdout,因此所有输出都转到同一个文件。

如果/dev/nullxargs找到一行输入(例如,因为您只有一个文件,或者打包文件时,最后一个包只有一个文件)。如果您egrep使用单个文件调用,它不会打印文件名。既然你特别说你想要文件名,告诉egrep搜索/dev/null保证总是至少有两个文件。由于/dev/null保证为空,因此您永远不会在其中找到任何内容,并且它不会显示在您的输出中。

xargsfind. 如果要在当前目录及其子目录的所有“.txt”文件中搜索“foo”:

find . -name "*.txt" -print | xargs egrep foo /dev/null

会成功的。如果您的文件名中包含空格,则它们不会被引用并且egrep会混淆,因此请使用-print0选项 onfind-0xargs 上的选项:

find . -name "*.txt" -print0 | xargs -0 egrep foo /dev/null
于 2013-11-08T02:12:18.853 回答
0

我建议使用:

ls -l *.txt | cut -b 51-

在传递给or之前,也*.txt由您的终端扩展。所以是的,理论上你可以传递给命令的文件参数数量是有限制的。catgrep

  • ls -l *.txt为您提供目录中的文件列表。
  • |是一个管道,意味着您可以将上一个命令的输出传递到下一个命令。
  • cut -b 51-意味着您切断了前 50 个字节,并为您提供了文件名。
于 2013-11-07T23:42:19.093 回答