我有一个目录~/test
,其中有两个空目录:emptydir
和emptydir2
。
ls ~/test/*(/)
显示两者:
~/test/emptydir:
~/test/emptydir2:
但如果只有一个空目录,则ls ~/test/*(/)
什么也不显示。为什么会这样?
我有一个目录~/test
,其中有两个空目录:emptydir
和emptydir2
。
ls ~/test/*(/)
显示两者:
~/test/emptydir:
~/test/emptydir2:
但如果只有一个空目录,则ls ~/test/*(/)
什么也不显示。为什么会这样?
ls
当该实用程序在命令行中被赋予多个目录进行处理时,它需要打印出其所列目录的名称。无论这些目录是否为空。以下内容来自该实用程序的 POSIX 规范
ls
:如果您想要列出目录本身而不是其内容,那么请使用
ls
其-d
选项。为了补充@Kusalananda 的回答,请注意,这
ls
不是唯一一个在被要求处理一个参数时跳过打印标题的命令。在
ls dir
orls
中ls .
,由于它只传递了一个参数,ls
因此假定您知道要获取哪个目录的列表,因为您刚刚请求了它。当目录列表是扩展(此处为文件名生成,又称路径名扩展)的结果时,这种情况就会失效,而扩展恰好会产生一个且只有一个条目。这与当扩展为一个且仅一个文件时不会显示文件名相同
grep -- pattern *.txt
,或者grep
(请注意,传递多个文件不是标准的)。*.txt
head -- *.txt
head
其中一些实用程序的 GNU 实现具有强制打印标题的选项,即使只传递了一个参数,例如GNU的
-H
/或GNU / ,但 GNU 的情况并非如此。--with-filename
grep
-v
--verbose
head
tail
ls
然而,适用于许多命令的可移植方法是除了扩展结果之外还向命令传递一个额外的参数,以保证至少传递 2 个参数,并对输出进行后处理以在需要时删除相应的输出。
例如,GNU
grep -H -- pattern *.txt
可以可移植地编写grep -- pattern /dev/null *.txt
(不需要对输出进行后期处理,因为输出/dev/null
是空的,所以那里不会有任何匹配)。对于
ls
,您可以使用ls -- /dev/null *(/) | tail -n +3
,这里使用tail -n +3
删除其自身的列表/dev/null
,它应该放在第一位,因为 POSIX 要求首先列出非目录操作数的输出。