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 -d
all 的变体显示了正确的内容——当前目录的名称:.
Jeff Schaller \xe2\x99\xa6s 的答案解释了该标志如何/为何-d
以这种方式运行。在这个答案中,我想详细说明为什么或何时有用。
ls -d
没有额外的参数很少有用。只有一个论点,我觉得它也不是很有用。您可以获得ls -ld dirname
一些有用的信息,例如权限、所有权和时间戳,但您也可以使用stat dirname
.
闪光的地方ls -d
是通配符。
比较:
\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/a
、one/b
、two/c
或 的太多信息two/d
,而ls -ld */*
可以。替代方案ls -l */
也是如此,但以不同的方式,通常我更喜欢 ; 的更紧凑的输出ls -ld */*
。当然,通配符允许我仅匹配某些名称,而ls -l */
始终列出子目录的所有内容。的结果ls -ld */*[ac]
只能通过-d
标志来获得。
-d
当我将通配符传递给 时,我几乎总是使用该标志ls
。-d
当我传递单个目录时,我很少使用标记它。-d
当我根本不传递任何参数时,我从不使用该标志。