![ls 列出目录参数无法按预期工作](https://linux22.com/image/134600/ls%20%E5%88%97%E5%87%BA%E7%9B%AE%E5%BD%95%E5%8F%82%E6%95%B0%E6%97%A0%E6%B3%95%E6%8C%89%E9%A2%84%E6%9C%9F%E5%B7%A5%E4%BD%9C.png)
我希望仅列出当前目录中的所有目录(而不是文件)。我期望ls -ld ./*
仅返回手册页所述的目录
列出目录而不是内容
目前该命令返回当前目录下的所有文件和目录。
或者,我有以下命令可以实现我的要求,但我在想是否有一个内置选项可以实现相同的要求
ls -lF ./ | grep ".*/$"
答案1
虽然该-d
标志确实阻止ls
下降到目录中,但这正是它的作用。这并不意味着仅列出目录。这两个语句之间有一个微妙的区别,如果您运行ls -d some_file
,那么ls
将向您显示some_file
。由于您使用的是 shell 通配符 ( ./*
),因此该通配符会扩展以包含当前目录中的文件以及当前目录中的目录。由于 shell 执行通配符和扩展,而不是ls
,因此 Shellls
正在接收文件列表。
要解决此问题,您需要确保 shell glob 不包含常规文件。您可以通过/
在 glob 上使用尾随来完成此操作。由于/
是文件名中禁止使用的特殊字符,但它表示目录之间的分隔,因此您可以使用它来仅匹配目录。
例如:
ls -d */
答案2
这可能取决于您的外壳。
如果您在星号后附加斜杠,大多数现代 POSIX 兼容 shell 仅列出目录:
echo */
所以如果你打电话:
ls -l */
您会得到您所期望的列表。
如果您不想查看目录的内容,请致电:
ls -ld */
答案3
基本上我的困惑是为什么ls -ld ./*
dint只返回dirs。 ls 参数需要一个您想要列出的目录。并且由于 shell 对所有文件和目录评估了参数*/
(因为通配符);所有内容都已列出,包括子目录下的文件。你们许多人建议的解决方案是ls -ld */
;这里的通配符仅扩展到目录并排除文件。