如何强制“echo *”在Unix中的单独行上打印项目?

时间:2015-05-11 19:15:11

标签: shell unix echo

*是否有变量? 当我echo *时,它会在一行中列出我的工作目录。如何强制此命令在单独的行上打印每个项目?

3 个答案:

答案 0 :(得分:10)

执行此操作的正确方法是完全抛弃不可移植echo printf

 printf '%s\n' *

然而,printf(和echo)方式有一个缺点:如果命令不是内置的并且有很多文件,那么扩展*可能会溢出命令行的最大长度(您可以使用getconf ARG_MAX进行查询。从而, 要列出文件,请使用为作业设计的命令:

ls -1

没有这个问题;甚至

find .

如果你需要递归列表。

答案 1 :(得分:3)

echo命令本身不能这样做。

如果你想在自己的行上打印每个文件名,我想你想要对输出做些什么,而不仅仅是阅读它。如果你告诉我们这是什么,我们可以更有效地帮助你。

要列出当前目录中的文件,您可以使用ls -1。如果{1}}命令的输出被重定向到文件或通过管道,则每行打印一个名称。

另一种选择是ls命令。如果你给它的参数多于格式字符串中指定的参数,它将循环显示格式,所以这个:

printf

每行还会打印一个文件名。

答案 2 :(得分:2)

" *" - 不是变量。它被称为通配符或文件名扩展 - bash本身扩展了wilcards并用文件名替换它们。所以*将被替换为当前目录中所有非隐藏项的列表。 如果您只想打印当前目录中的项目列表 - 您可以使用ls。此外,如果你想使用" echo" - 你可以这样做:

for item in *
do
    echo $item
done

它将在单独的行上打印每个项目。

有关bash globbing的更多详细信息,请点击此处: http://www.tldp.org/LDP/abs/html/globbingref.html