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

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

有没有办法可以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只显示目录而不是文件和目录?

答案1

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

在 Unix 和 Linux 上,通配符扩展由 shell 完成,并且与权限无关。在根目录中,你执行

ls *

命令ls本身收到从 shell 来看(类似于)

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 -d不带 a的行为*是上述行为的简单扩展。只需再了解一件事ls:当没有参数时,它假定默认参数为.。现在没有-d选项,上述行为导致.枚举所命名的目录的内容并显示其内容的信息。 -d选项,目录.将被视为文件,并显示其自身的信息,而不是枚举其内容。

答案2

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

答案3

尝试这个

 find . -mindepth 1 -maxdepth 1 -type d

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

答案4

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

find -maxdepth 1 -type d -ls;

以上仅会为您提供有关该-l选项的详细信息。

相关内容