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