0

所以我正在做这个任务,我在 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”命令获取这些文件的第一行文本的任何想法。

4

4 回答 4

0

In case you have files with spaces in their name, the following should resist :

for file in *.txt
do 
    echo "$i" 
    head -1 "$i"
done
于 2014-11-20T06:57:51.217 回答
0

你几乎做对了。它ls需要包含在反引号中,以便将其结果作为文件名参数提供给head. 要获取当前目录中所有文本文件的第一行,您可以使用:

head -n 1 `ls -Q *.txt`

要获取子目录中的文件,您可以使用lsandgrep像您一样(只需进行ls递归,并在每行末尾grep搜索 .txt ),但我建议您查看该命令。find

编辑:正如@jonathanleffler 和@unhammer 所提到的,ls如果文件在一个目录中,则无需使用。此外,在没有 -Q 选项的情况下使用命令替换是一个坏主意ls,因为它会破坏带有空格的文件名,但选项 -Q 在ls. 如果您需要在子目录中搜索,请使用find(或 **/*.txt,如果您的 shell 支持它,如 Jonathan 建议的那样)。

编辑 2:由于 OP 已经非常接近find命令,我将在此处添加我的解决方案:

find . -name "*.txt" -print -exec head -n 1 "{}" \;
于 2014-11-20T06:49:38.533 回答
0

嘿伙计们,我想出了答案;这就是任务所要寻找的:

find ~/Main -name '*.txt' -head -exec {} \;
于 2014-11-21T05:50:30.020 回答
0

我知道我可能在这里完成某人的作业,但请 不要这样做

head -n 1 `ls *.txt`

– 如果有包含空格的文件,它将失败。而且您不能引用它,因为它会将所有输出视为一个文件。

显示当前目录中所有 [1] .txt 文件的第一行的正确方法是:

head -n 1 *.txt

(对于其他一些文件夹,head -n 1 /other/folder/*.txt)。这将适用于各种奇怪的文件名,因为 shell 本身正确地将正确的文件名发送到 head 命令。

并且 head 足够聪明,当您传递几个文件时,它会告诉您希望在输出中看到文件名。


[1] 嗯,实际上是head -n 1 *.txt .*.txt因为 plain*.txt不包含以点开头的文件。

于 2014-11-20T07:01:05.797 回答