命令“ ls -d”未显示目录。有没有办法让“ ls”仅显示目录而不是文件和目录?


44

有没有办法ls只显示目录而不显示文件和目录?

从手册页:

   -d, --directory
          list directory entries instead of contents, and do not  derefer
          ence symbolic links

因此,如果我在/目录中键入它,我希望只能看到目录。而是显示“。”

$ cd /
$ ls -d
.

我原本希望ls -d向我展示:

$ ls -d
bin    data  home        opt    sbin  sys      var
boot   dev   lib         media  proc  selinux  tmp
cdrom  etc   lost+found  mnt    root  srv      usr

有没有办法ls只显示目录而不显示文件和目录?


17
lsd 可能非常令人困惑。
boehj 2011年

2
@jin ls -d * /有效。但是为什么我必须“ * /”才能得到想要的输出。
nelaaro 2011年

8
@nelaar -d并不意味着仅列出目录,它意味着不列出目录内容。尝试键入ls */,您将看到所有目录的内容。

2
我已经ldiralised以ls -d */.bashrc让用户轻松......这
DQdlM

1
ls可以给您大量信息,但不能仅显示目录一个标志...
DimiDak

Answers:


50

您的期望基于DOS Think / Windows Think,这是错误的。在MS-DOS,Windows以及其他一些IBM / Microsoft操作系统上,通配符扩展由命令本身完成,在通配符扩展期间,诸如命令/a选项之类的dir属性充当属性过滤器。 dir扩展通配符(如)*,命令解释器将按原样传递给通配符,如果/a指定通配符,它将对返回的内容应用适当的过滤器。(在某些操作系统上,可以将属性过滤器分配给系统调用以枚举目录,并且操作系统内核或其文件系统驱动程序将自身应用它们。)

在Unices和Linux上,通配符扩展由外壳程序完成,并且不考虑权限。当您在根目录中执行

ls *

什么ls命令本身接收来自壳(像)

ls bin home opt var boot dev tmp etc lost + found root usr

什么-d/ --directory选项的作用是关闭一个通常情况下一个。接下来通常发生的是ls依次查看每个参数,将其视为目录,然后决定枚举其内容。对于命名文件的参数,它只是打印出文件本身的信息。使用该-d选项,目录就像文件一样被对待。因此,ls打印出作为参数传递的每个目录的信息,就像它们是文件一样。

因此-d 不是 “仅打印目录”选项。实际上,不仅没有这样的选择,而且没有。有不能是这样的选项。通配符扩展由外壳程序完成,并且(sh至少在POSIX 中)无法告诉外壳程序在扩展*为名称列表时检查权限和文件类型位。要仅获取目录名称列表,有必要要么使用find命令(如所述)ztank1013,要么使用技巧(以斜杠结尾的路径名表示目录条目).,如所述Jin。(Jin的技巧以ls命令接收参数结束

ls bin / home / opt / var / boot / dev / tmp / etc / lost + found / root / usr /

因为该模式*/实际上是将路径名与两个部分匹配,第二个部分为空,所以并没有完全按照要求进行。特别是,它将指向目录的符号链接视为目录。)

ls -d没有a 的行为是上述行为的*简单扩展。一个人只需要知道一件事ls:如果不给它参数,它将假定默认参数.。现在,如果没有-d选项,上述行为将导致.枚举命名的目录的内容并显示其内容的信息。 使用-d选项,目录将.被当作​​文件一样对待,并显示其自身的信息,而不是枚举的内容。


3
不可能有这样的选项”-这是一个很强的声明-这样的选项的实现是显而易见的:请参见非目录参数并忽略它。什么不能实施的是相当于dir /s *.txt[而不诉诸引用通配符作为查找]
Random832

6
是的,但是没有逻辑上的理由ls 没有一个选项可以过滤掉作为参数传入的项目。该“通配符扩展从入门类型检查离婚”其实是无关紧要的,因为这有什么做通配符扩展-只是入门类型检查,这没有理由不能做到完全内LS。如果ls --color可以将它们涂成蓝色,ls -F可以在其后加上/,而ls -l可以将d放在该模式下,则其他一些假设选项可以省略它们。这样的选项不存在并不表示它“ 不能 ”。
2011年

5
Random832提出了一个要点:ls 可以选择过滤文件或目录,并且这与让shell进行扩展并不互相排斥。ls中没有竞争条件:它可以过滤它,因为它可以正常地统计文件。(shell扩展和ls,FWIW之间已经存在竞争。)我认为shell扩展只是部分原因:shell扩展(通常是过滤)不在ls中实现,因为它需要在cp中再次实现,MV等。Unix是一种“做一件事,做好事”。如果您需要高级过滤,则可以使用一些工具。
Thanatos

2
ls -p选项/仅将符号添加到目录。没有理由不使用仅输出这些输出的功能(而不是ls -p | grep /)来扩展输出打印功能。
Anne van Rossum 2014年

3
@JdeBP,同伴攻击(“ kiddo”)和傲慢(除了您不知道“ Unix基础”之外的每个人)都不属于技术性讨论。此外,当您争辩说命令选项无法控制由Shell完成的通配符扩展时,您将感到无聊。当然不能!无论是Random832,还是Thanatos,还是Anne van Rossum,甚至问题本身都没有以任何方式提及通配符。反对意见是ls --only-directories .可以ls最终添加该选项。
mkalkov 2015年

30

您可以使用ls -d */,或ls -d .*/用于隐藏目录。


使用/的巧妙技巧
Mono

是的,这很好。在任何情况下都行不通吗?
iyrin 2015年

5
+1用于在一行中提供答案。我猜想已接受的答案也在某处。
微积分骑士

如何在没有目录的情况下在脚本中使用它?
DimiDak

13

尝试这个

 find . -mindepth 1 -maxdepth 1 -type d

仅获取当前位置下的目录。


5

你可能还喜欢

tree -d 

整齐地列出了所有目录和子目录,并以树形结构的图形表示形式。


3
tree -dL 1
深一层

不幸的是,您不能与树结合太多。#tree -d | grep wc -l(标准输入)
DimiDak

5

如果您只想查看带有ls -l(ELL)选项之类详细信息的目录,则可以使用以下方法:

find -maxdepth 1 -type d -ls;

上面只会为您提供该-l选项提供的详细信息。


1
最好使用find -maxdepth 1 -type d -exec ls -d {} +通常的ls格式来获取输出。
mkalkov 2015年

4

如果您想以其他方式完成工作,请尝试以下操作:

ls -l | grep ^d

尽管在这种情况下仅使用一个工具就足够了。管道始终在为您提供帮助。我喜欢Linux的灵活性,希望您能做到。


1
这将不仅过滤目录。
ocodo

2
@Slomojo,这将过滤掉目录以外的所有内容。你什么意思?
mkalkov

是的,您需要使用-l(长整数),以便权限排在前面。目录的“ d”。另外,您还会得到一个不错的目录条目清单。
geoO

1

希望这可以纠正您的需求。以下命令将仅列出给定路径中的目录。

ls -F <path> | grep /

例:

ls -F ~ | grep /
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.