仅列出UNIX中的目录


219

我只想列出指定路径中的目录(ls没有这样的选项)。另外,可以通过单行命令完成此操作吗?


12
对于未来:也许与编程无关紧要的unix / linux basics类型的问题最好保留在那里:unix.stackexchange.com
echox 2010年

Answers:


315

尝试此操作ls -d */以列出当前目录中的目录


17
嘿,那真是太好了,我一直习惯我们ls -al | grep '^d'-这更加简洁。
paxdiablo

43
为什么使用* / ?? 请解释!?
Chandeep 2012年

6
我没有适当的解释,但是我知道*/强制显示仅以正斜杠结尾的项目,在这种情况下,即使不使用-F选项,也将显示为目录ls。类似于行为ls *php以及它如何显示php以目录结尾的所有文件。
大卫·汉考克

3
@ user975234有人问了类似的问题,链接上
user1766760 2013年

17
只是echo */也会做同样的事情
2014年

95

试试这个:

find . -maxdepth 1 -type d

8
在我看来,这似乎是应该完成的方式。与建议的ls解决方案不同,find它只负责完成工作(不依赖于外壳通配符扩展,这可能会施加限制)。这也更加简洁。
彼得2014年

1
不好的是,如果您试图遍历结果,并且结果中的名称中有空格,则此操作将无效。
2014年

2
或者,如果您不想包括目录本身:find * -maxdepth 0 -type d
James Ko

@ubiquibacon无论是使用find-print0-exec选项。

1
这真的很慢,至少在Mac上是如此。这似乎做充分的递归搜索这find通常不会,但只有在输出深度1.文件夹
卡拉Brightwell

22

下列

find * -maxdepth 0 -type d

基本上是根据条件过滤“ *”的扩展,即当前目录中的所有条目-type d

优点在于,输出与相同ls -1 *,但仅在目录和条目中不以点开头


13

您可以使用ls -d */tree -d

另一个解决方案是遍历,但这取决于您使用的外壳以及是否支持遍历目录。

例如ZSH:

zsh # ls *(/)

3
您使用哪种Unix风格tree
Johnsyweb

例如所有主要的linux发行版?抱歉,我没收到问题?
echox 2010年

1
我有一个Debian发行版,tree默认情况下未安装(尽管它在存储库中)。
Stephen Schrauger

1
我认为tree命令不是本机Unix命令,所以请低票(如果我输入错了,请纠正我)。
Tiago Cardoso

10

由于有很多方法可以实现,因此这是另一种方法:

tree -d -L 1 -i --noreport
  • -d:目录
  • -L:树的深度(因此,我们的工作目录为1)
  • -i:无缩进,仅打印名称
  • --noreport:不在树列表的末尾报告信息

并感谢您解释这些开关。堆栈溢出是关于答案的信息,当人们像您一样对您进行解释而不是“仅阅读man条目!”时,我总是很感激。<-这不是答案。
Fusion27 2014年

从第2行开始(仅用点跳过该行):tree -d -L 1 -i --noreport | tail -n +2
adius

这是排名最高的解决方案,列出了软链接目录,并以一种有用的方式进行了处理,将它们公开为链接。我更喜欢这种变化:tree -C -d -L 1 -i --noreport | tail -n+2
Amnon Harel

9
ls -l | grep '^d'

您可以创建别名并将其放入配置文件中

alias ld="ls -l| grep '^d'"

1
链接不使用此命令查看。链接可以是文件或目录。示例:lrwxrwxrwx 1 root root 21 avril 15 17:38 cron-> / lib / init / upstart-job。
c-toesca 2014年

7
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'

☀找到。-maxdepth 1 -type d -name [^ \。] * | sed's:^ \ ./ ::'zsh:找不到匹配项:[^。] *
Michael Cole

6

为了列出当前工作目录中的目录, ls -d */可以使用。如果需要列出隐藏目录,请使用此命令 ls -d .*/


6

使用它来获取目录列表

ls -d */ | sed -e "s/\///g"

ls -d <自定义目录路径> | sed -e“ s / \ /// g”不起作用..任何提示?
Dhwanit

谢谢!我只是想要没有所有权限的目录列表,而这样做就可以了。:)
encodingjeremy19年

5

find specifiedpath -type d

如果您不想在子目录中递归,则可以执行以下操作:

find specifiedpath -type d -mindepth 1 -maxdepth 1

请注意,.还将列出“点”目录(其名称以开头);但不是特殊目录.也不是..。如果您不希望使用“点”目录,则可以将grep其删除:

find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'


1
提起投票mindepth摆脱.吧!😁–
adius

5

答案将取决于您的外壳

zsh例如,在中,您可以执行以下操作:

echo *(/)

并且将显示当前工作目录中的所有目录。

请参阅man zshexpn以获取更多信息。

一种替代方法是使用find(1),它应适用于大多数Unix风格:

find . -maxdepth 1 -type d -print  

find(1)有很多用途,所以我绝对推荐man find


4

您可以将tree命令及其d开关用于此目的。

% tree -d tstdir
tstdir
|-- d1
|   `-- d11
|       `-- d111
`-- d2
    `-- d21
        `-- d211

6 directories

查看man tree更多信息。


我没有投票,只是有同样的问题。看来您的答案是对echox的欺骗,也许是为什么?
Louis Waweru 2013年

1
@Louis-谢谢,我什至没有注意到他提到过tree。哦,好吧,我不是要窃取任何人的雷声。
slm

为树的可视化投票
Andrejs

我认为downvotes是因为它是一个相同的答案 stackoverflow.com/a/3667405/523742
蒂亚戈·卡多索

@TiagoCardoso-我的工作早于2年。
slm

2

如果我有此目录:

ls -l

lrwxrwxrwx  1 nagios nagios     11 août   2 18:46 conf_nagios -> /etc/icinga
-rw-------  1 nagios nagios 724930 août  15 21:00 dead.letter
-rw-r--r--  1 nagios nagios  12312 août  23 00:13 icinga.log
-rw-r--r--  1 nagios nagios   8323 août  23 00:12 icinga.log.gz
drwxr-xr-x  2 nagios nagios   4096 août  23 16:36 tmp

要获取所有目录,请使用-L解析链接:

ls -lL | grep '^d'

drwxr-xr-x 5 nagios nagios   4096 août  15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

没有-L:

ls -l | grep '^d'

drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

conf_nagios目录丢失。


2
### If you need full path of dir and list selective dir with "name" of dir(or dir_prefix*):
find $(pwd) -maxdepth 1 -type d -name "SL*"

1

这一直在为我工作:

`ls -F | grep /`

(但是,我切换到echo */@nos提到的)


1

这是另一个显示链接目录的解决方案。我稍微喜欢它,因为它是“正常” ls -l输出的子集:

ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always

1

在bash中:

ls -d */

将列出所有目录

ls -ld */

将以长格式列出所有目录

ls -ld */ .*/

将以长格式列出所有目录,包括隐藏目录。


我最近切换到了zsh(MacOS Catalina),发现:

ls -ld */ .*/

如果当前目录不包含任何隐藏目录,不再起作用。

zsh: no matches found: .*/

它将打印上面的错误,但是也将无法打印任何目录。

ls -ld *(/) .*(/)

同样也会失败。

到目前为止,我发现这:

ls -ld */;ls -ld .*/

是一个不错的解决方法。的;是命令分隔符。但这意味着如果没有隐藏目录,它将列出目录,并且仍然会为没有隐藏目录显示错误:

foo
bar
zsh: no matches found: .*/

ls是用于当前目录列表内容的shell命令
-l是用于指定要在Longford中列出的标志(每行一个项+一堆其他很酷的信息)
-d是用于将所有目录“作为文件”而不是递归列出的标志
*/是参数“列出以斜杠结尾的所有文件”
*是用于“ anything”的简单正则表达式命令,因此*/要求shell列出“以'/'结尾的任何东西”

请参阅man ls以获取更多信息。


我把这个:

alias lad="ls -ld */;ls -ld .*/"

在我的.zshrc中,它似乎可以正常工作。

注意:我也发现

ls -ld .*/ 2> /dev/null

不起作用,因为它仍然在终端上显示sterr。如果/找到解决方案,我将更新我的答案。


0

du -d1是最短的选择。(只要您不需要将输入传递到另一个命令。)


0

要仅列出指定路径中的目录,只需键入ls -l | grep drw


如果任何文件名包含,则该文件可能包括文件,drw并且将排除所有者不可读写的目录。grep ^d效果更好。
Tom Zych

0

详细目录清单

  • ls -l | grep'^ d'
  • ls -l | grep“ ^ d”

清单目录
- LS-D * /


您有充分的理由重复已经存在的答案吗?
Maxim Sagaydachny
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.