有没有正确的方法来列出当前目录的子目录?


10

我可以通过以下方式找到目录的子目录

ls -d -- */

要么

ls -l | grep "^d"

但是这两者似乎都是间接的,而且我想可以找到一种仅查找目录的标准方法。有正确的方法吗?如果不是,这两种方法中的任何一种都会导致边缘情况下的不良行为吗?(符号链接,隐藏目录等)

Answers:


17

答案将更多地取决于您打算对输出执行的操作,而不是所需的内容。如果您只想在终端上看到一个可供视觉参考的列表,那么您的第一个解决方案实际上非常不错。如果要处理输出,则应考虑使用另一种方法。

使列表馈入另一个程序的最可靠的方法之一就是使用find

find -maxdepth 1 -type d

之所以对feed有用,是因为它find可以使用-print0或以适当的转义字符串的形式输出用null分隔的数据作为使用的另一个程序的参数-exec。有关为什么这比解析ls的输出更好的参考,请参阅Greg Wiki上的ParsingLS


4
我必须键入find . -maxdepth 1 -type d才能使其在OS X Yosemite上工作。
肖恩·莱文

1
要列出子目录,还必须指定-mindepth,如中所示 find . -maxdepth 1 -mindepth 1 -type d。否则,.将包括当前目录。
tinlyx

5

仅供参考-在ZSH(但不是BASH),你也可以这样做:ls -d -- *(/); (/)修饰符告诉ZSH只有水珠目录。

也就是说,它与您自己提出的解决方案(ls -d -- */)并没有太大不同,而且与标准相去甚远。

至于(的输出ls可能会根据其他标志而有所不同):

% ls
dir0 dir1 dir2 file0 file1 file2
% ls -d -- */
dir0/ dir1/ dir2/
% ls -d -- *(/)
dir0 dir1 dir2

zsh将星号扩展到所有文件和目录,(/)标志选择该扩展的一部分,因此ls *(/)以及回声*(/)也会起作用,或者以更zshly的方式打印-l *(/ )。前两个版本也可以使用bash。
2012年

1
请注意,它*(/)会扩展到非隐藏目录,而*/扩展到非隐藏目录或目录的符号链接(或至少指向我们可以识别为目录的路径的符号链接)。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.