UNIX编程:Head命令

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命令来显示文本行,我丢失了。使用“人头”我没有太多关于如何使用它的信息 这是我到目前为

所以我正在处理这个任务,我在Unix中使用head命令时遇到了问题。我们的任务是查找目录中的所有.txt文件,并显示每个文件的第一行文本。输出应如下所示:

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 {} \;