我进入了man page ls
,选项的条目-d
如下:
-d, --directory 列出目录条目而不是内容,并且不取消引用符号链接
所以,我认为该ls -d
命令将显示给定目录中的所有目录。但是我进入一个目录并尝试了两个不同的命令:
获取目录::
ls -l | grep ^d
这个有效,所有 7 个目录都被显示获取目录
ls -d
:这确实不是显示7个目录,仅一个点.
我不明白我是否错误地使用了该选项,或者是否误解了其含义,该-d
选项的实际含义和用法是什么?
答案1
ls -d
显示有关目录或符号链接的信息 - 该信息(简单来说)是其各自的路径。逻辑假设是d代表目录,因为我遇到的 UNIX 术语中最基本的定义是“列出目录”。
从表面上看,这似乎没什么用;但事实上,它并没有什么用处。假设您当前位于一个包含 2 个子目录的目录中:
documents music
不带任何选项使用ls documents
会给你一个内容列表文件正如您在上面正确指出的那样。使用ls -d documents
只会打印名称 - 因为该文件夹的路径相对于您当前所在的位置 - 与其名称相同 -文件!这可以扩展(尽管在基本用法上有些多余),ls -d $PWD/*
它将显示所有文件和文件夹,但包含它们的工作目录(因此是 PWD - 以前的工作目录)。
当与 * 运算符结合使用时,它确实有一个有用的功能 -ls -d */
将仅显示当前工作目录中的目录。
将焦点转向符号链接定义的一部分,如果您要使用ls -d ~
- 波形符扩展 - 它将打印当前 HOME 目录的路径。然后,这可以用于不同的应用程序(取决于操作系统),并且确实有一些实际用途;您可以将您的语句进一步修改为或ls -d ~your-username
并提供这些用户的 HOME 路径。另一个例子可以在 apache 服务器环境中看到,这里使用用户名类似地显示其托管空间的路径(相对而言,其 HOME 目录)。ls -d ~another-username
ls -d ~root
有多种功能可以与此结合使用,但上面涵盖了该运算符背后的核心功能 - 简而言之,-d 是一个专门显示目录/路径信息的运算符。如果您想进一步研究,有一个很好的代码生成器可以使用 ls 函数(包括一些 -d 功能):ls 代码生成器。
答案2
ls
本身,没有任何选项或任何东西,将“列出当前目录”。默认情况下,“列出目录”是指其中包含的文件。
该-d
标志更改ls
不是列出指定目录中的文件,而是列出有关目录本身的信息。它并不像您错误地认为的那样,指的是“当前目录中的目录”。它仅指“当前目录”。
这就是为什么ls -d
只返回.
。
答案3
不确定术语,但 ls -d 仅列出有关后续内容的信息,仅此而已,即它不会扩展目录列表,因此:
ls -ld /usr/bin
只会给你一行关于 /usr/bin 本身的输出。
和
ls -ld *
只会为您提供有关 pwd 中每个文件或目录的信息,但不会展开任何目录以列出其内容。
正如已经提到的,您可以使用 find 来列出目录,如果您愿意,仍然可以使用 ls -d :
find /usr/bin -type d -exec ls -ld {} \;
就是找到/usr/bin下的所有目录,以防不清楚。
答案4
ls -d
ls -d .
与执行命令之前相同 ls
,bash shell 将展开所有通配符。该-d
选项指示ls
仅列出有关传递的参数的信息,而不列出其内容,无论参数是目录还是文件。
为了进一步解释,举个例子ls .*
为了进一步解释,以;。期望它会列出.
以 为前缀的所有文件和目录。但是,当 bash 扩展通配符时,它也*
包含.
和。..
您可以通过检查命令的输出来验证 bash 扩展的输出echo .*
。对于ls .*
bash 扩展 * (包括.
和)后收到的每个参数..
,如果参数是目录,它将列出内容。结果是一些输出不是您所期望的。
如果您使用ls -d .*
相反的方式,“-d”选项指示仅列出参数的详细信息,而不列出其内容,即使它是目录也是如此。现在这将为您提供预期的输出。