UNIX编程:Head命令
所以我正在处理这个任务,我在Unix中使用head命令时遇到了问题。我们的任务是查找目录中的所有.txt文件,并显示每个文件的第一行文本。输出应如下所示:UNIX编程:Head命令,unix,unix-head,Unix,Unix Head,所以我正在处理这个任务,我在Unix中使用head命令时遇到了问题。我们的任务是查找目录中的所有.txt文件,并显示每个文件的第一行文本。输出应如下所示: fargo.txt //first line on the text file here turtle.txt //first line on the text file here 等等 我有在目录及其子目录中查找.txt文件的代码,但是我必须使用head命令来显示文本行,我丢失了。使用“人头”我没有太多关于如何使用它的信息 这是我到目前为
fargo.txt
//first line on the text file here
turtle.txt
//first line on the text file here
等等
我有在目录及其子目录中查找.txt文件的代码,但是我必须使用head命令来显示文本行,我丢失了。使用“人头”我没有太多关于如何使用它的信息
这是我到目前为止得到的
ls ~/Main/* | grep '\.txt'
我也试过了
ls ~/Main/* | grep '\.txt' `head -n 1`
关于如何使用“head”命令获取这些文件的第一行文本的任何想法 你几乎把它做好了。需要将
ls
括在反勾中,以便将其结果作为文件名参数提供给head
。要获取当前目录中所有文本文件的第一行,请使用:
head -n 1 `ls -Q *.txt`
要获取子目录中的文件,您可以像以前一样使用ls
和grep
(只需使ls
递归,并使grep
在每行末尾搜索.txt),但我建议您查看find
命令
编辑:如@jonathanleffler和@unhammer所述,如果文件位于一个目录中,则不需要使用ls
。另外,在命令替换中使用ls
而不使用-Q选项是一个坏主意,因为它会用空格分隔文件名,但是选项-Q在ls
的大多数实现中都不可用。如果您需要在子目录中搜索,请使用find
(或**/*.txt,如果您的shell支持它,请按照Jonathan的建议)
编辑2:由于OP已经非常接近find
命令,我将在这里添加我的解决方案:
find . -name "*.txt" -print -exec head -n 1 "{}" \;
如果文件名中有空格,则应满足以下条件:
for file in *.txt
do
echo "$i"
head -1 "$i"
done
我知道我可能要完成别人的家庭作业了,但是请 不要这样做 –如果存在包含空格的文件,则会失败。你不能引用它,因为它会把所有的输出都当作一个文件 显示当前目录中所有[1].txt文件的第一行的正确方法是:
head -n 1 *.txt
(对于其他文件夹,head-n1/other/folder/*.txt
)。这将适用于各种奇怪的文件名,因为shell本身正确地向head命令发送正确的文件名
head非常聪明,当您传递多个文件时,它会告诉您希望在输出中看到文件名
[1] 嗯,实际上它是
head-n1*.txt.*.txt
,因为普通*.txt
不包括以点开头的文件。嘿,伙计们,我找到了答案;这就是任务所要寻找的:
find ~/Main -name '*.txt' -head -exec {} \;
对于循环,您需要一个
。请阅读。别指望我们帮你做作业!也许一个指挥中心的例子可以帮助我?我想要的只是一个例子,而不是答案。我认为我们不需要for循环,因为我们在课程中还没有这样做。请阅读……的文档等……如果完美的文件名格式不是问题,类似这样的方法也可以:find-输入f-iname'*.txt'-print0 | xargs-0 head-n1
无需使用ls
;不使用它可以避免文件名带有空格的问题。backticks和ls
仅在递归情况下是必需的,但是find
是更好的选择。在bash
(问题中没有规定)中,启用bash 4.x(4.3测试)和shopt-s globstar
,您可以使用直接在shell中生成文件名列表。发送到echo时也应引用$i(您不希望您的计算机发出“叮当”声,因为有人认为将文件命名为“-e\a.txt”很有趣)。另外,这也是多余的——如果你给它多个文件,head本身会写文件名。我想你的意思是find~/Main-name'*.txt'-exechead-n1{}代码>–虽然这不会显示文件名,但为此您需要执行find~/Main-name'*.txt'-print-exec-head-n1{}代码>
find ~/Main -name '*.txt' -head -exec {} \;