有时,我只需要检查目录而不是文件。命令ls有什么选择吗?还是有任何实用程序来执行此操作?

评论

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

@cwd如果未指定任何文件,则ls默认为.。-d表示不打印目录的内容,请打印目录本身。

@cwd尝试使用ls -p在目录名称后显示/。所以* /只是一个与目录名和/组合匹配的模式。

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

#1 楼

我知道已经有一个选定的答案,但是您可以通过ls来获得请求的行为:

ls -ld -- */


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

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

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


请注意,-l是可选的。

评论


真好我从不认为目录的末尾有一个隐式的/,但是现在我看到您的回答是有意义的。毕竟,制表符补全总是添加它。

– gvkv
10-9-6'3:46

-d代表目录,-l代表长格式。 -的目的是什么?

–Dineshkumar
2015年4月17日15:03



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

– biocyberman
17年1月31日在20:59



当目录数超过最大参数长度时,find也具有优势。

–史蒂文·D
17年2月1日在9:31

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

–蒂玛
17年11月1日,0:46

#2 楼

否,但是可以使用简单的find命令来完成:如有必要,可以为任一别名。

评论


在Ubuntu 14.04上,它是-maxdepth 1.。find也想让我翻转一下命令:find。 -maxdepth 1 -d型

–布拉德·库皮(Brad Cupit)
15年8月28日在14:33

那ls -F | grep /解决方案效果奇妙!这似乎是我在FreeBSD机器上可以使用的唯一工具。我认为使用Fish意味着带有* /的任何内容可能都不起作用?

– cjm
16年7月27日在4:38

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

– gvkv
16年7月27日在13:21

#3 楼

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

#4 楼

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

评论


然后是ls -a以包含名称以点(。)开头的目录条目,这避免了match的麻烦。还有...

–nclark
20-2-3在14:50

#5 楼

使用zsh(在macOS上默认发现,甚至在以前是/bin/sh),您将使用glob限定符根据文件类型选择文件:非隐藏目录:

ls -d -- *(/)



列出所有目录:

ls -d -- *(D/)


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


还包括指向目录的符号链接:使得在符号链接解析之后可以应用更多的限定符。)



#6 楼

像这样使用ls命令
❯ ls -1d plugins/*/
plugins/localizable/
plugins/redmine_agile/
plugins/redmine_gitlab_hook/
plugins/redmine_mermaid_macro/
plugins/redmine_open_links_in_new_window/


#7 楼

$ ls -p | grep /


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

#8 楼

列出目录不仅有一种选择...

但是您可以使用-d(列出目录本身,而不是其内容)和*/来匹配目录本身:

ls -d */

并尝试将点号用于隐藏的ls -d .*/

只是为了好玩,请尝试:ls -dls */。差异将显而易见!

Ref:


https://stackoverflow.com/a/14352330/12453339
https:// unix .stackexchange.com / a / 447829/385133


评论


请注意,已接受的答案基本上已经显示了这一点,以及-可以防止将以破折号开头的目录名称解释为选项。

– Kusalananda♦
20年1月2日,21:32

这是一个很好的链接。在那里设置了标签“ bash”。我只在man bash中找到“如果后跟/ ....”。在“路径名扩展”中,说明“ *”。

–user373503
20年1月3日,0:09

Kusalananda,请阅读Steven D答案的第一行...我的短些。我会说明选项和匹配项。感谢您的关注!

– marcio
20年1月3日,14:24



现在,第二个(SE)链接缺少“ bash”标签,并且patrick的回答很好地避免了解释。如果与上面的zsh解决方案进行比较,您会发现这是扩展模式匹配的外壳问题。 bash中的* /表示法在哪里定义?

–user373503
20年1月3日,17:12

我在上一条评论中的意思是,当当前目录中有一个名为-l的文件或目录时,接受的答案将不会开始表现出异常。

– Kusalananda♦
20年1月3日,17:20



#9 楼

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

评论


很高兴知道我不是唯一使用grep“ ^ d”骇客的人

– Michael Mrozek
10-9-6'2:10



据我所知,他描述的行为不是错误,如果使用的是GNU ls,则是相同的。 -d选项显示目录列表,而不显示目录。要了解为什么这很有用,请查看ls -l / home和ls -dl / home之间的区别

–史蒂文·D
10-9-6'2:11



克拉并不是贝壳特有的。您可以只使用ls -l / | grep ^ d。如果要使用引号,由于不需要参数扩展,因此请使其成为单引号。 ls -l / | grep'^ d'。是的,我是学徒。但是确实如此。 :)

–通配符
16年11月1日在1:08

#10 楼

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

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


评论


在我所知道的所有ls实现中,在ls的POSIX规范中,-C是按列输出,而不是跳过非目录文件。在您的示例中,/印在文件名之前,而ls实现不会这样做。使用-F,/会附加到目录文件的文件名中。

–StéphaneChazelas
18年6月21日在16:15



当我看到这个答案时,我想知道“这是真的吗?” @StéphaneChazelas和Jeff Schaller-您是否否决公然的错误答案?

– G-Man说“恢复莫妮卡”
19年2月21日,下午3:51

#11 楼

ls -G


这将以蓝色显示您的目录

评论


使用此命令时仅看到目录吗?

–don_crissti
16 Nov 1'0:55