我有标准LS安装了,我也有LSD安装,它是 ls 的 nerd-font 直接替代品。我提到这一点是因为该错误可能与别名有关。
为了立即进行测试,我已经alias ls=ls
删除了所有自定义命令。
如果我输入ls
/etc 目录,其中显然有几个子文件夹(您可以在没有 -d 标志的情况下看到这些子文件夹),我会得到以下内容:
>>>root@Unraid:/etc# ls -d /
/
>>>root@Unraid:/etc# ls -d
.
>>>root@Unraid:/etc# lsd -d
答案1
当您提供该-d
选项时,您是在告诉ls
您不希望它列出任何目录的内容,而只列出目录名称本身。当您不提供任何额外信息时论点to ls
,默认是列出当前目录。因此,您对ls -d
all 的变体显示了正确的内容——当前目录的名称:.
答案2
杰夫·夏勒 (Jeff Schaller) 的回答解释了标志如何/为何-d
如此表现。在这个答案中,我想详细说明为什么或何时有用。
ls -d
没有额外的参数很少有用。只有一个论点,我觉得它也不是很有用。您ls -ld dirname
可以获得一些有用的信息,例如权限、所有权和时间戳,但您也可以使用stat dirname
.
闪光的地方ls -d
是通配符。
比较:
$ ls -l */*
one/a:
total 0
-rw-rw-r-- 1 gholl o16217 0 Mar 25 10:20 aa
one/b:
total 0
-rw-rw-r-- 1 gholl o16217 0 Mar 25 10:20 bb
two/c:
total 0
-rw-rw-r-- 1 gholl o16217 0 Mar 25 10:20 ab
two/d:
total 0
-rw-rw-r-- 1 gholl o16217 0 Mar 25 10:20 oe
和:
$ ls -ld */*
drwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 one/a
drwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 one/b
drwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 two/c
drwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 two/d
或者
$ ls -l */
one/:
total 8
drwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 a
drwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 b
two/:
total 8
drwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 c
drwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 d
或者
$ ls -ld */*[ac]
drwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 one/a
drwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 two/c
当我使用通配符时,通常我会这样做不是想要进入目录。替代方案ls -l */*
没有给我提供有关目录one/a
、one/b
、two/c
或 的太多信息two/d
,而ls -ld */*
可以。替代方案ls -l */
也是如此,但以不同的方式,通常我更喜欢ls -ld */*
;的更紧凑的输出。当然,通配符允许我仅匹配某些名称,而ls -l */
始终列出子目录的所有内容。的结果ls -ld */*[ac]
只能通过标志来获得-d
。
-d
当我将通配符传递给 时,我几乎总是使用该标志ls
。-d
当我传递单个目录时,我很少使用标记它。-d
当我根本不传递任何参数时,我从不使用该标志。
答案3
默认情况下,ls
将显示有关每个给定名称的信息,目录除外。如果给出了任何目录,它将扫描每个目录以获取名称列表,然后显示有关这些目录的信息。
然而,该-d
选项抑制了这一点,导致ls
不特殊对待目录,而只是显示有关给定的所有名称的信息。
如果ls
在没有路径名参数的情况下调用,它将按照.
给定的方式运行。如果没有-d
这个,将显示当前目录的内容,但有了-d
它,就会简单地报告.
——正如您所观察到的。