ls -d 命令仅返回 `.` 例如,并且没有子目录

ls -d 命令仅返回 `.` 例如,并且没有子目录

我有标准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 -dall 的变体显示了正确的内容——当前目录的名称:.

答案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/aone/btwo/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它,就会简单地报告.——正如您所观察到的。

相关内容