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

nel*_*aro 44 linux bash ls

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

从手册页:

   -d, --directory
          list directory entries instead of contents, and do not  derefer?
          ence symbolic links
Run Code Online (Sandbox Code Playgroud)

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

$ cd /
$ ls -d
.
Run Code Online (Sandbox Code Playgroud)

我期待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
Run Code Online (Sandbox Code Playgroud)

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

Jde*_*eBP 49

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

在 Unices 和 Linux 上,通配符扩展由 shell 完成,并且不考虑权限。当,在根目录中,你做

ls *

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

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

什么-d/--directory选项的作用是关闭一个通常情况下一个。接下来通常会ls依次查看每个参数,看到它们是目录,并决定枚举它们的内容。对于命名文件的参数,它只是打印出文件本身的信息。使用该-d选项,目录就像文件一样被处理。所以ls打印出作为参数传递的每个目录的信息,就像它们是文件一样。

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

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

因为模式*/实际上是在匹配路径名由两个部分组成,第二个是空的,所以没有相当做什么期望。特别是,它会将指向目录的符号链接视为目录。)

ls -dwithout a的行为是上述行为的*简单扩展。人们只需要了解一件事ls:当它没有给出任何参数时,它假定默认参数为.。现在没有-d选项,上述行为导致的目录由名为内容.被枚举并显示其内容的信息。 使用-d选项,目录将.被视为文件,并显示其自身的信息,而不是枚举其内容。

  • 是的,但是没有合乎逻辑的原因 ls _can't_ 有一个选项可以过滤掉作为参数传入的项目。“通配符扩展与条目类型检查分离”这一事实是无关紧要的,因为这与通配符扩展无关_完全_与通配符扩展无关 - 只有条目类型检查,没有理由不能_完全_在 ls 中完成。如果 ls --color 可以将它们变成蓝色, ls -F 可以在它们后面放置一个 / ,并且 ls -l 可以在模式中放置一个 'd',那么其他一些假设选项可以省略它们。不存在这样的选项并不意味着它“_不能_”。 (6认同)
  • Random832 提出了一个不错的观点:`ls` *可以* 有一个选项来过滤文件或目录,这与让 shell 进行扩展并不相互排斥。ls 中没有竞争条件:它可以在正常统计文件时对其进行过滤。(外壳扩展和 ls 之间已经存在竞争,FWIW。)我认为外壳扩展只是部分原因:外壳扩展(和一般过滤)没有在 ls 中实现,因为它需要在 cp 中再次实现、mv 等。Unix 是“做一件事,把它做好”。如果您需要高级过滤,可以使用一些工具。 (5认同)
  • “有 _cannot_ 是这样的选项” - 这是一个相当强的声明 - 这样一个选项的实现是显而易见的:查看非目录参数并忽略它。_can't_ 实现的是等效于`dir /s *.txt` [无需引用通配符作为查找] (3认同)
  • @JdeBP,ad-hominem 攻击(“kiddo”)和傲慢(除了你不知道“Unix 的基本原理”之外的每个人)不属于技术讨论。此外,当您争辩说命令选项无法控制由 shell 完成的通配符扩展时,您就是在拉扯稻草人。_当然,它不能!_ Random832、Thanatos、Anne van Rossum 甚至问题本身都没有以任何方式提及通配符。反对意见是 `ls --only-directories .` 选项最终可以添加到 `ls` 中。 (3认同)
  • `ls -p` 选项仅向目录添加一个 `/` 符号。没有理由不使用仅输出这些内容(而不是`ls -p | grep /`)来扩展输出打印功能。 (2认同)
  • 答案是迂腐而狂妄的。考虑 *ls -l* 列出工作目录中的所有内容。人们可能非常合理地期望 *ls -d* 只列出当前目录中的所有 *directories*(特别是考虑到 OP 引用的 *man ls* 的输出)。显示工作目录中所有内容的约定,受选项标志设置的一些约束,在 bash 中无处不在。根本没有什么奇怪的或 MSDOSish。不管发生什么事,只要回答这个问题。 (2认同)

Jin*_*Jin 30

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

  • +1 用于在一行中提供答案。我猜接受的答案也在某处。 (5认同)

zta*_*013 13

尝试这个

 find . -mindepth 1 -maxdepth 1 -type d
Run Code Online (Sandbox Code Playgroud)

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


fue*_*zig 5

你可能还喜欢

tree -d 
Run Code Online (Sandbox Code Playgroud)

它整齐地列出了所有目录和子目录,并带有树结构的图形描述。

  • 并且只有一层深度:`tree -dL 1` (3认同)

Adn*_*tti 5

如果您只想查看包含详细信息ls -l(如(ELL) 选项的目录),则可以使用以下命令:

find -maxdepth 1 -type d -ls;
Run Code Online (Sandbox Code Playgroud)

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