有没有办法可以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
选项的详细信息。