我刚跑:
grep "" *.txt > out.txt
1500 个文件。输出只包括几百个文件..为什么?
使用时:
cat *.txt > out.txt
这有效,但我希望文件名作为行名。
谢谢!
最佳答案
你确定所有的文件真的出现在 cat *.txt > out
中吗? ?除非您正好处于每个命令的最大字符数的边缘,否则应该没有区别。尝试这个:
ls -1 | egrep '\.txt$' | xargs egrep "" /dev/null > out
ls -1
列出目录中的所有文件,每行一个文件名,第一个 egrep
只过滤掉以“.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
会感到困惑,所以使用 -print0
find
上的选项和 -0
xargs 上的选项:find . -name "*.txt" -print0 | xargs -0 egrep foo /dev/null
关于shell - "grep"是否有它可以处理的最大文件数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19848938/