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

And*_*y T 0 linux command-line ls gnu utilities

我安装了标准ls,还安装了lsd,它是 ls 的书呆子字体替代品。我提到这一点是因为该错误可能与别名有关。

为了立即进行测试,我已经alias ls=ls删除了所有自定义命令。

如果我输入ls/etc 目录,其中显然有几个子文件夹(您可以在没有 -d 标志的情况下看到这些子文件夹),我会得到以下内容:

>>>root@Unraid:/etc# ls -d /
/
>>>root@Unraid:/etc# ls -d
.
>>>root@Unraid:/etc# lsd -d
 ./
>>>root@Unraid:/etc# lsd -d /
 //
Run Code Online (Sandbox Code Playgroud)

丢失的代码点只是一个文件夹图标。为了清楚起见,我用浏览器兼容的表情符号替换了所有框。LSD 已经安装几天了,不是问题。他们的行为相同。

我在提示行前面加上前缀>>>只是为了让它们更容易挑选出来。

让我们以我的主目录为例。~正确答案是、lsd中有 2 个文件夹pkg

>>>root@Unraid:~# lsd
 lsd/   pkg/   appdataUNRAID.code-workspace@    mdcmd@

>>>root@Unraid:~# ls -F
appdataUNRAID.code-workspace@  lsd/  mdcmd@  pkg/


>>>root@Unraid:~# lsd -F
   lsd/     pkg/    appdataUNRAID.code-workspace@    mdcmd@
>>>root@Unraid:~# ls
appdataUNRAID.code-workspace  lsd  mdcmd  pkg
>>>root@Unraid:~# ls -lhp
total 0
lrwxrwxrwx 1 root root  30 Mar 14 16:41 appdataUNRAID.code-workspace -> ./appdataUNRAID.code-workspace
drwxrwxrwx 3 root root 140 Mar 18 11:35 lsd/
lrwxrwxrwx 1 root root  21 Mar 13 18:55 mdcmd -> /usr/local/sbin/mdcmd
drwxrwxrwx 2 root root 140 Mar 24 10:10 pkg/
Run Code Online (Sandbox Code Playgroud)

同样,此处缺少这些图标,但此处“lsd”中的单个目录具有正确的文件夹图标。这两个命令都采用适当的标志。

在这里我们可以看到他们很好地获取了标志,并且他们发现两个目录非常好,但是两个实现ls仅返回.-d 标志上的目录,即使与其他标志结合使用也是如此。

>>> root@Unraid:~# lsd -d
   ./

root@Unraid:~# ls -dFl
drwx--x--- 11 root root 420 Mar 24 10:10 ./


## The full text flag also doesn't work.
root@Unraid:~# ls  --directory
.
Run Code Online (Sandbox Code Playgroud)

其他标志是什么并不重要,如果 D 标志位于则 两个单独的实现ls仅显示当前目录.

我的意思是,它甚至没有显示默认的..第二个目录。我也尝试添加递归。

发生了什么?

Jef*_*ler 20

当您提供该-d选项时,您是在告诉ls您不希望它列出任何目录的内容,而只列出目录名称本身。当您不向 提供任何其他参数ls,默认情况下会列出当前目录。因此,您对ls -dall 的变体显示了正确的内容——当前目录的名称:.


ger*_*rit 7

Jeff Schaller \xe2\x99\xa6s 的答案解释了该标志如何/为何-d以这种方式运行。在这个答案中,我想详细说明为什么或何时有用。

\n

ls -d没有额外的参数很少有用。只有一个论点,我觉得它也不是很有用。您可以获得ls -ld dirname一些有用的信息,例如权限、所有权和时间戳,但您也可以使用stat dirname.

\n

闪光的地方ls -d是通配符。

\n

比较:

\n
$ ls -l */*\none/a:\ntotal 0\n-rw-rw-r-- 1 gholl o16217 0 Mar 25 10:20 aa\n\none/b:\ntotal 0\n-rw-rw-r-- 1 gholl o16217 0 Mar 25 10:20 bb\n\ntwo/c:\ntotal 0\n-rw-rw-r-- 1 gholl o16217 0 Mar 25 10:20 ab\n\ntwo/d:\ntotal 0\n-rw-rw-r-- 1 gholl o16217 0 Mar 25 10:20 oe\n
Run Code Online (Sandbox Code Playgroud)\n

和:

\n
$ ls -ld */*\ndrwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 one/a\ndrwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 one/b\ndrwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 two/c\ndrwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 two/d\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
$ ls -l */\none/:\ntotal 8\ndrwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 a\ndrwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 b\n\ntwo/:\ntotal 8\ndrwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 c\ndrwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 d\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
$ ls -ld */*[ac]\ndrwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 one/a\ndrwxrwxr-x 2 gholl o16217 4096 Mar 25 10:20 two/c\n
Run Code Online (Sandbox Code Playgroud)\n

当我使用通配符时,通常我不想进入目录。替代ls -l */*方案没有给我提供有关目录one/aone/btwo/c或 的太多信息two/d,而ls -ld */*可以。替代方案ls -l */也是如此,但以不同的方式,通常我更喜欢 ; 的更紧凑的输出ls -ld */*。当然,通配符允许我仅匹配某些名称,而ls -l */始终列出子目录的所有内容。的结果ls -ld */*[ac]只能通过-d标志来获得。

\n
    \n
  • -d当我将通配符传递给 时,我几乎总是使用该标志ls
  • \n
  • -d当我传递单个目录时,我很少使用标记它。
  • \n
  • -d当我根本不传递任何参数时,我从不使用该标志。
  • \n
\n