我刚跑:
grep "" *.txt > out.txt
在 1500 个文件上。输出只包含几百个文件。为什么?
使用时:
cat *.txt > out.txt
这可行,但我希望文件名作为行名。
谢谢!
我刚跑:
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
选项 onfind
和-0
xargs 上的选项:
find . -name "*.txt" -print0 | xargs -0 egrep foo /dev/null
我建议使用:
ls -l *.txt | cut -b 51-
在传递给or之前,也*.txt
由您的终端扩展。所以是的,理论上你可以传递给命令的文件参数数量是有限制的。cat
grep
ls -l *.txt
为您提供目录中的文件列表。|
是一个管道,意味着您可以将上一个命令的输出传递到下一个命令。cut -b 51-
意味着您切断了前 50 个字节,并为您提供了文件名。