所以我正在进行这项任务,我在Unix中使用head命令时遇到了问题。我们的任务是查找目录中的所有.txt文件,并显示每个文本的第一行文本,输出应如下所示:
fargo.txt
//first line on the text file here
turtle.txt
//first line on the text file here
等等
我有代码在目录及其子目录中找到.txt文件,但是我必须使用head命令来显示文本行而且我丢失了。使用“man head”我没有得到很多关于如何使用它的信息。
这是我远远看到的东西
ls ~/Main/* | grep '\.txt'
我也试过
ls ~/Main/* | grep '\.txt' `head -n 1`
有关如何使用“head”命令获取这些文件的第一行文本的任何想法。
答案 0 :(得分:0)
你几乎做对了。它是需要用反引号括起来的ls
,以便将其结果作为文件名参数提供给head
。要获取当前目录中所有文本文件的第一行,您将使用:
head -n 1 `ls -Q *.txt`
要获取子目录中的文件,您可以使用ls
和grep
(只需要ls
递归,并使grep
搜索.txt 结束每一行),但我建议你看一下find
命令。
编辑:如@jonathanleffler和@unhammer所述,如果文件位于一个目录中,则无需使用ls
。此外,在没有-Q选项的情况下在命令替换中使用ls
是一个坏主意,因为它会破坏其中包含空格的文件名,但是ls
的大多数实现中都没有选项-Q。如果您需要在子目录中搜索,请使用find
(如果您的shell支持,则使用** / * .txt,如Jonathan所建议的那样)。
编辑2 :由于OP已经与find
命令非常接近,我将在此处添加我的解决方案:
find . -name "*.txt" -print -exec head -n 1 "{}" \;
答案 1 :(得分:0)
如果您的名称中包含空格的文件,则以下内容应该抵制:
for file in *.txt
do
echo "$i"
head -1 "$i"
done
答案 2 :(得分:0)
我知道我可能会在这里完成一些功课,但请 没有
head -n 1 `ls *.txt`
- 如果有包含空格的文件,它将失败。并且你不能引用它,因为它将所有输出视为一个文件。
显示当前目录中所有[1] .txt文件的第一行的正确方法是:
head -n 1 *.txt
(对于其他一些文件夹,head -n 1 /other/folder/*.txt
)。这将适用于所有类型的奇怪文件名,因为shell本身正确地将正确的文件名发送到head命令。
当你传递几个文件时,脑袋足够聪明,可以告诉你想要在输出中看到文件名。
[1]嗯,实际上它是head -n 1 *.txt .*.txt
,因为普通*.txt
并不包含以点开头的文件。
答案 3 :(得分:0)
find ~/Main -name '*.txt' -head -exec {} \;