欢迎各位兄弟 发布技术文章
这里的技术是共享的
在 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 开头的目录 |
这是一种简洁高效的方式,适用于大多数场景!