欢迎各位兄弟 发布技术文章
这里的技术是共享的
在 Linux 中,如果你只想列出当前目录下的子文件夹(目录),而不显示文件,可以使用 ls 结合一些选项和参数。以下是几种方法:
-d 和通配符
bashls -d */ # 最后一个斜杠表示目录
或者
ls -d /aaa/*/ # 最后一个斜杠表示目录
*/ 会匹配所有目录(/ 表示目录)。
-d 选项确保只列出目录本身,而不是目录内容。
find 命令bashfind . -maxdepth 1 -type d -not -path '.' | sed 's|^\./||'
-maxdepth 1 限制只查找当前目录。
-type d 只匹配目录。
-not -path '.' 排除当前目录标记 .。
sed 用于移除路径前缀 ./。
ls -l 和 grep
bashls -l | grep '^d' | awk '{print $9}'
ls -l 以长格式列出,目录会以 d 开头。
grep '^d' 筛选出目录行。
awk '{print $9}' 提取目录名(适用于简单文件名)。
tree(需安装)bashtree -d -L 1
-d 只显示目录。
-L 1 限制层级深度为 1(当前目录)。
如果目录名包含特殊字符(如空格),方法 1 和方法 3 可能需要额外处理。
方法 1 是最简洁的推荐方式。
示例输出:
bash$ ls -d */ dir1/ dir2/ subfolder/
ls -d */ 详解
ls -d */ 命令ls -d */ 是一个常用的 Linux 命令,用于列出当前目录下的所有子文件夹(目录),而不显示文件。下面是对其各部分的详细解释:
ls 命令ls 是 List Sirectory 的缩写,用于列出目录内容。
基础用法:
bashls
显示当前目录的文件和子目录(不包括隐藏文件)。
-d 选项-d 是 --directory 的缩写,作用是:
直接显示目录本身,而不递归列出其内容。
默认情况下,ls 会对目录递归显示其文件,但 -d 会阻止这种行为。
对比示例:
bashls subdir # 显示 subdir 目录下的所有文件 ls -d subdir # 只显示 subdir(目录名本身)
*/ 通配符*/ 是一个 Shell 通配符(glob pattern),含义是:
* 匹配 任意名称(0个或多个字符)。
/ 限定只匹配 目录(而非文件)。
因此,*/ 会匹配当前目录下 所有子目录。
示例: 假设目录结构如下:
.
├── file1.txt
├── file2.txt
├── dir1/
├── dir2/
└── dir3/
运行 ls -d */ 会显示:
bashdir1/ dir2/ dir3/
而不会列出 file1.txt 和 file2.txt。
如果想要更灵活的处理(如排除 . 和 .. 或排序),可以结合 grep 和 sort:
bashls -d */ | grep -v '^\.' | sort
grep -v '^\.' —— 排除 . 和 ..(当前目录和父目录)。
sort —— 按字母排序。
❌ 为什么 ls -d * 和 ls -d */ 结果不同?
ls -d * 会列出 所有文件和目录(因为 * 匹配所有内容,而 -d 仅阻止递归)。
ls -d */ 只会列出 目录(因为 */ 只匹配目录)。
❌ 如果目录名包含空格或特殊字符怎么办?
推荐使用 find 或 ls -d -- *:
bashls -d -- */
-- 告诉 ls 停止解析选项,防止特殊文件名被误解析。
❌ 没有子目录时会显示什么?
如果没有子目录,可能会报 No such file or directory(因为 */ 匹配不到任何目录)。
这时可以通过 shopt -s nullglob(Bash)让通配符不匹配时返回空:
bashshopt -s nullglob ls -d */
如果 ls -d */ 在某些情况下不适用,可尝试:
bashfind . -maxdepth 1 -type d ! -name '.' # 使用 find 列出目录(排除 ".")
| 命令 | 作用 |
|---|---|
ls -d */ | 只列出当前目录的所有子目录 |
ls -d * | 列出所有文件和目录(仅名字,不递归) |
ls -d dir*/ | 列出以 dir 开头的目录 |
这是一种简洁高效的方式,适用于大多数场景!
ls -ld /software/* 与 ls -ld /software/*/ 区别
ls -ld /software/* 和 ls -ld /software/*/ 命令的区别在于通配符 * 的匹配范围和后缀斜杠 / 的影响,具体如下:
ls -ld /software/*匹配目标:
通配符 * 会展开为 /software/ 目录下 所有文件和目录(隐藏文件除外)。
行为:-d 选项让 ls 只显示这些条目本身的信息(不递归展开子目录内容)。
结果示例:
drwxr-xr-x 2 user group 4096 Jan 1 10:00 /software/app1
drwxr-xr-x 2 user group 4096 Jan 1 10:00 /software/app2
-rw-r--r-- 1 user group 100 Jan 1 10:00 /software/README.txt
(包含文件和目录)
ls -ld /software/*/匹配目标:
通配符 */ 会展开为 /software/ 目录下 所有子目录(仅目录,且以 / 结尾明确要求目录类型)。
行为:
同样用 -d 显示目录本身信息,但仅匹配目录。
结果示例:
drwxr-xr-x 2 user group 4096 Jan 1 10:00 /software/app1/
drwxr-xr-x 2 user group 4096 Jan 1 10:00 /software/app2/
(不显示文件,仅目录)
| 命令 | 匹配内容 | 是否包含文件 | 是否要求目录结尾 |
|---|---|---|---|
ls -ld /software/* | 所有文件和目录 | 是 | 否 |
ls -ld /software/*/ | 仅子目录(以 / 结尾) | 否 | 是 |
为何 */ 仅匹配目录?
Shell 的通配符规则中,尾部斜杠 / 会强制匹配目录类型(类似 ls -d */ 的常见用法)。
符号链接处理:
如果目录下有符号链接,*/ 会匹配指向目录的链接(视为目录),而 * 会直接显示链接本身。可通过 -L 选项调整行为。
根据需要选择命令:仅需目录时用 */,需全部条目时用 *。
ls -ld /software/* 中 有 -d 为什么还会显示文件
在 ls -ld /software/* 中,-d 选项的作用是 阻止 ls 递归列出目录内容,但它 并不会限制通配符 * 的匹配范围。
-d 的作用:
默认情况下:如果 ls 的参数是一个目录(如 /software/app1),ls 会显示该目录下的内容(例如 /software/app1/file1)。
-d 的作用:让 ls 只显示目录本身(而非其内容)。
例如:
bashls -ld /software/app1 # 显示 `/software/app1` 的信息,不会列出 `/software/app1` 下的文件。
* 通配符的影响:
如果路径是 目录,则 -d 会阻止递归显示其内容(但目录本身会被显示)。
如果路径是 文件,-d 对它无影响(文件没有子内容),还是会显示文件信息。
/software/* 会被 Shell 首先展开为 /software/ 下的 所有文件与目录(如 /software/app1、/software/app2、/software/README.txt)。
ls -ld 会逐个处理这些展开后的路径,对每个路径应用 -d 选项。
假设 /software/ 有以下内容:
/software/app1/ # 目录
/software/app2/ # 目录
/software/README.txt # 文件
ls -ld /software/*
通配符 * 展开为 app1 app2 README.txt,然后 ls -ld 分别处理:
对目录:-d 生效,显示目录本身(不递归内容):
drwxr-xr-x 2 user group 4096 Jan 1 10:00 /software/app1
drwxr-xr-x 2 user group 4096 Jan 1 10:00 /software/app2
对文件:-d 无意义,但仍会显示:
-rw-r--r-- 1 user group 100 Jan 1 10:00 /software/README.txt
ls -ld /software/*/*/ 仅匹配目录,因此展开为 app1/ app2/,结果只显示目录:
drwxr-xr-x 2 user group 4096 Jan 1 10:00 /software/app1/
drwxr-xr-x 2 user group 4096 Jan 1 10:00 /software/app2/
-d 只影响目录的显示行为(不递归内容),但不影响通配符 * 匹配到的内容(文件和目录都会显示)。
若想仅匹配目录,需显式使用 */ 或结合 find/stat 等工具。例如:
bashls -d */ # 仅当前目录的子目录 find /software -maxdepth 1 -type d # 仅列出目录