使用“ ls”命令是否有只能看到目录的选项?


73

有时,我只需要检查目录而不是文件。命令ls有什么选择吗?还是有任何实用程序可以做到这一点?

编辑:我正在使用Mac OS X,即使我有目录,也ls -d给我.


4
有人可以解释为什么ls -d只给出.以及为什么*/必须添加到末尾才能使其起作用吗?
cwd

3
@cwd如果未指定任何文件,则ls默认为.。并且-d意味着不打印目录的内容,而是打印目录本身。
Mikel 2012年

1
@cwd尝试使用ls -p/后会显示目录名称。因此*/,只是一种与目录名称和/组合匹配的模式。
皮特2012年

我为我的〜/ .bash_aliases文件创建了一个实现@Steven_D答案的函数:gist.github.com/rjurney/998f4951a57bfa5daeb9a6c18f6f4827
rjurney

Answers:


84

我知道已经有一个选定的答案,但是您可以通过以下方式获得所要求的行为ls

ls -ld -- */

(请注意,“-”标记参数的末尾,以防止将以连字符开头的文件夹名称解释为其他命令选项。)

这将在运行它的当前工作目录中列出所有非隐藏的(除非您配置外壳程序的glob来扩展它们)目录(请注意,它还包括指向目录的符号链接)。要获取其他文件夹的所有子目录,请尝试:

ls -ld /path/to/directory/*/

请注意,-l是可选的。


5
真好 我从来没有考虑过目录/的末尾有一个隐式-但是现在我看到您的回答是有意义的。毕竟,制表符补全总是添加它。
gvkv

-d for dir, -l for long format。目的是--什么?
Dineshkumar 2015年

1
尽管这看起来很短并且可以在大多数情况下使用,但是当需要一个真实目录而不是目录的符号链接时,可能不想使用这种方法。因此,find在这种情况下,实际上是一个不错的选择。
biocyberman

1
find当目录数超过最大参数长度时,它也具有优势。
史蒂文·D

向后工作,我刚刚意识到您可以使用扩展名忽略任何内容ls -alhF --ignore=*.*。不知道这将如何处理“隐藏”文件夹,即.myHiddenFolder
Timmah

14

不,但是一个简单的find命令就能做到:

find . -type d -depth 1

要么 grep

ls -F | grep /

然后,如有必要,您可以为任一别名。


6
在Ubuntu 14.04上是-maxdepth 1。还find希望我find . -maxdepth 1 -type d
取消

ls -F | grep /解决方案行之有效!这似乎是我在FreeBSD机器上可以使用的唯一工具。我认为使用Fish意味着与之搭配*/可能不起作用?
cjm

我从来没有和Fish一起工作过,所以我不确定,但是-F选项可以解决很多问题。
gvkv

7

我喜欢tree实用程序来概述目录结构。它在MacPorts和我尝试过的所有Linux发行版中都可用。

tree -d -L 2

这将显示所有目录,分为两个级别。


5

我还需要查看隐藏目录,因此修改了上面的建议以适合我的需求

ls -d -- */ .*/

(取决于外壳,其中可能还包括...


2

使用zsh(在macOS上默认发现,它甚至曾经存在于/bin/sh其中),您将使用glob限定符根据文件的类型选择文件:

  • 列出非隐藏目录:

    ls -d -- *(/)
    
  • 列出所有目录:

    ls -d -- *(D/)
    

    .并且..始终被排除,如果需要,可以分别添加)

  • 还包括指向目录的符号链接:

    ls -d -- *(D-/)
    

    -因此,在符号链接解析后可以应用更多限定词)。


-1

我认为ls在Mac OS X上存在错误。一种解决方法是使用grep ... ls -l / | grep "^d"


1
很高兴知道我不是唯一使用grep "^d"黑客的人
Michael Mrozek

6
据我所知,他描述的行为不是错误,如果使用的是GNU ls,则是相同的。-d选项显示目录列表,而不显示目录。要了解为什么这很有用,请参见:ls -l /homels -dl /home
Steven D

克拉并不是贝壳特有的。您可以使用ls -l / | grep ^d。如果你正在打算使用引号,因为你并不需要参数扩展,使他们的单引号。 ls -l / | grep '^d'。是的,我是一个学徒。但确实如此。:)
通配符

-1
$ ls -p | grep /

如果该文件是目录,则该-p标志将ls在每个文件名后添加一个斜杠(`/')。


-2

最简单的方法是键入以下命令。这适用于大多数UNIX和Linux平台和版本。您可以-F根据需要跳过/ ,但这是在目录名末尾添加/的参数。该-C参数仅捕获目录名称-它们都在当前目录中。如果只想在当前路径中看到目录和子目录,只需添加-R参数(ls -CFR)。

# ls -CF
/dir1  /dir2  /dir3  /beaches  /Work  /Other 

1
ls我知道的所有实现中,在POSIX规范中ls-C都是以column为输出,而不是跳过非目录文件。在您的示例中,在/文件名之前打印,这是任何ls实现都不会执行的。使用-F,将/被附加到目录文件的文件名中。
斯特凡Chazelas

当我看到这个答案时,我想知道“这是什么地方?” @StéphaneChazelas和Jeff Schaller —您难道否定公然错误的答案吗?
G-Man

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.