我跑了:
grep "" *.txt > out.txt
1500个文件。输出只包含几百个文件..为什么?
使用时:
cat *.txt > out.txt
这有效,但我希望文件名为行名。
谢谢!
答案 0 :(得分:1)
您确定所有文件都真正显示在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
答案 1 :(得分:0)
我建议使用:
ls -l *.txt | cut -b 51-
您的终端也会*.txt
扩展cat
,然后传递给grep
或ls -l *.txt
。所以是的,从理论上讲,你可以传递给命令的文件参数有一个限制。
|
为您提供目录中的文件列表。cut -b 51-
是一个管道,意味着您可以将上一个命令的输出传递给下一个命令。