如何在 Unix 中强制 "echo *" 在不同的行上打印项目?
How to force "echo *" to print items on separate lines in Unix?
*
有变数吗?
当我执行 echo *
时,它会在一行中列出我的工作目录。我如何强制此命令在单独的行上打印每个项目?
*
- 不是变量。它被称为 globbing 或 filename expansion - bash 本身扩展通配符并用文件名替换它们。因此 *
将替换为当前目录中所有非隐藏项目的列表。
如果您只想打印当前目录中的文件列表 - 您可以使用 ls
。另外,如果你想使用 echo
- 你可以这样做:
for item in *
do
echo $item
done
它将在单独的行上打印每个项目。
有关 bash globbing 的更多详细信息,您可以在此处找到:
http://www.tldp.org/LDP/abs/html/globbingref.html
正确的做法是完全放弃不可移植的 echo
,转而使用 printf
:
printf '%s\n' *
然而,printf(和echo)方式有一个缺点:如果命令不是内置的并且有很多文件,扩展*
可能会溢出命令行的最大长度(您可以使用 getconf ARG_MAX
查询)。因此,
要列出文件,请使用专为作业设计的命令:
ls -1
哪个没有这个问题;甚至
find .
如果你需要递归列表。
echo
命令本身无法做到这一点。
如果您想将每个文件名打印在各自的行中,我想除了阅读它之外,您还想对输出做一些事情。如果您告诉我们那是什么,我们可能会更有效地帮助您。
要列出当前目录中的文件,可以使用ls -1
。如果 ls
命令的输出被重定向到一个文件或通过管道,它也会每行打印一个名称。
另一种选择是 printf
命令。如果您给它的参数多于格式字符串中指定的参数,它将循环显示格式,因此:
printf '%s\n' *
还将每行打印一个文件名。
*
有变数吗?
当我执行 echo *
时,它会在一行中列出我的工作目录。我如何强制此命令在单独的行上打印每个项目?
*
- 不是变量。它被称为 globbing 或 filename expansion - bash 本身扩展通配符并用文件名替换它们。因此 *
将替换为当前目录中所有非隐藏项目的列表。
如果您只想打印当前目录中的文件列表 - 您可以使用 ls
。另外,如果你想使用 echo
- 你可以这样做:
for item in *
do
echo $item
done
它将在单独的行上打印每个项目。
有关 bash globbing 的更多详细信息,您可以在此处找到: http://www.tldp.org/LDP/abs/html/globbingref.html
正确的做法是完全放弃不可移植的 echo
,转而使用 printf
:
printf '%s\n' *
然而,printf(和echo)方式有一个缺点:如果命令不是内置的并且有很多文件,扩展*
可能会溢出命令行的最大长度(您可以使用 getconf ARG_MAX
查询)。因此,
要列出文件,请使用专为作业设计的命令:
ls -1
哪个没有这个问题;甚至
find .
如果你需要递归列表。
echo
命令本身无法做到这一点。
如果您想将每个文件名打印在各自的行中,我想除了阅读它之外,您还想对输出做一些事情。如果您告诉我们那是什么,我们可能会更有效地帮助您。
要列出当前目录中的文件,可以使用ls -1
。如果 ls
命令的输出被重定向到一个文件或通过管道,它也会每行打印一个名称。
另一种选择是 printf
命令。如果您给它的参数多于格式字符串中指定的参数,它将循环显示格式,因此:
printf '%s\n' *
还将每行打印一个文件名。