gpt4 book ai didi

linux - 当从 ls | 传送结果时 head 不起作用grep

转载 作者:太空宇宙 更新时间:2023-11-04 04:38:39 25 4
gpt4 key购买 nike

我正在尝试打印目录中所有文件的前 10 行。目前,我正在使用:

ls -p | grep -v /

从 ls 结果中删除所有目录,并仅返回该目录中的文件。当我这样做时:

ls -p | grep -v / | head

我希望打印所有文件的前十行,但它不起作用。

有人可以帮忙吗?

最佳答案

您的错误是假设命令从标准输入接收的是参数。事实并非如此。

当 head 从管道命令接收数据时,它接收的是数据流。 head 命令读取该数据的方式与从作为参数传递的一个文件中读取数据的方式完全相同。这样想(这是伪代码,它不会起作用):

PSEUDO_PIPELINE <= ls -p | grep -v /  # Not valid shell syntax
head PSEUDO_PIPELINE # Not valid shell syntax

实际上有一种(有效的)方式来表达这一点,它被称为进程替换:

head <(ls -p | grep -v /)

这将实现与您观察到的完全相同(不需要的)结果,但更明显的是管道前面的命令实际上是一个文件,而不是参数列表。

标准输入(以及输出流、标准输出和标准错误)是每个命令从其启动上下文接收的内容。如果需要的话,它就像一个“隐藏参数”,并且进程可以与它交互(通过读取它直到到达文件末尾,因为它是一个特殊文件,但仍然是一个文件)。

现在你应该明白为什么你得到的是前面命令的前 10 10 行输出,而不是列出的每个文件的前 10 行。

您可以通过以下方式实现您想要的:

find . -mindepth 1 -maxdepth 1 -type f -exec printf "\n%s ------\n" {} \; -exec head {} \;

这会找到每个文件,然后打印标题/分隔符行以及每个文件的第一行。

关于linux - 当从 ls | 传送结果时 head 不起作用grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42224180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com