欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

inux ls 列出子文件夹 不列出文件 AG chatgpt 有大用 有大大用

在 Linux 中,如果你只想列出当前目录下的子文件夹(目录),而不显示文件,可以使用 ls 结合一些选项和参数。以下是几种方法:

方法 1:使用 -d 和通配符

bash    
ls -d */              # 最后一个斜杠表示目录
或者
ls -d /aaa/*/        # 最后一个斜杠表示目录
   



  • */ 会匹配所有目录(/ 表示目录)。

  • -d 选项确保只列出目录本身,而不是目录内容。

方法 2:结合 find 命令

bash    
find . -maxdepth 1 -type d -not -path '.' | sed 's|^\./||'    



  • -maxdepth 1 限制只查找当前目录。

  • -type d 只匹配目录。

  • -not -path '.' 排除当前目录标记 .

  • sed 用于移除路径前缀 ./

方法 3:使用 ls -l 和 grep

bash    
ls -l | grep '^d' | awk '{print $9}'    



  • ls -l 以长格式列出,目录会以 d 开头。

  • grep '^d' 筛选出目录行。

  • awk '{print $9}' 提取目录名(适用于简单文件名)。

方法 4:使用 tree(需安装)

bash    
tree -d -L 1    



  • -d 只显示目录。

  • -L 1 限制层级深度为 1(当前目录)。

注意事项

  • 如果目录名包含特殊字符(如空格),方法 1 和方法 3 可能需要额外处理。

  • 方法 1 是最简洁的推荐方式。

示例输出:

bash    
$ ls -d */ dir1/  dir2/  subfolder/    



ls -d */ 详解

详解 ls -d */ 命令

ls -d */ 是一个常用的 Linux 命令,用于列出当前目录下的所有子文件夹(目录),而不显示文件。下面是对其各部分的详细解释:


1. ls 命令

ls 是 List Sirectory 的缩写,用于列出目录内容。

基础用法:

bash
ls

显示当前目录的文件和子目录(不包括隐藏文件)。


2. -d 选项

-d 是 --directory 的缩写,作用是:

  • 直接显示目录本身,而不递归列出其内容。

  • 默认情况下,ls 会对目录递归显示其文件,但 -d 会阻止这种行为。

对比示例:

bash
ls subdir      # 显示 subdir 目录下的所有文件 ls -d subdir   # 只显示 subdir(目录名本身)

3. */ 通配符

*/ 是一个 Shell 通配符(glob pattern),含义是:

  • * 匹配 任意名称(0个或多个字符)。

  • / 限定只匹配 目录(而非文件)。

因此,*/ 会匹配当前目录下 所有子目录

示例: 假设目录结构如下:

.
├── file1.txt
├── file2.txt
├── dir1/
├── dir2/
└── dir3/

运行 ls -d */ 会显示:

bash
dir1/  dir2/  dir3/

而不会列出 file1.txt 和 file2.txt


4. 与其他命令的配合

如果想要更灵活的处理(如排除 . 和 .. 或排序),可以结合 grep 和 sort

bash
ls -d */ | grep -v '^\.' | sort
  • grep -v '^\.' —— 排除 . 和 ..(当前目录和父目录)。

  • sort —— 按字母排序。


5. 常见问题

❌ 为什么 ls -d * 和 ls -d */ 结果不同?

  • ls -d * 会列出 所有文件和目录(因为 * 匹配所有内容,而 -d 仅阻止递归)。

  • ls -d */ 只会列出 目录(因为 */ 只匹配目录)。

❌ 如果目录名包含空格或特殊字符怎么办?

  • 推荐使用 find 或 ls -d -- *

    bash
    ls -d -- */

    -- 告诉 ls 停止解析选项,防止特殊文件名被误解析。

❌ 没有子目录时会显示什么?

  • 如果没有子目录,可能会报 No such file or directory(因为 */ 匹配不到任何目录)。
    这时可以通过 shopt -s nullglob(Bash)让通配符不匹配时返回空:

    bash
    shopt -s nullglob ls -d */

6. 替代方案

如果 ls -d */ 在某些情况下不适用,可尝试:

bash
find . -maxdepth 1 -type d ! -name '.'  # 使用 find 列出目录(排除 ".")

总结

命令作用
ls -d */只列出当前目录的所有子目录
ls -d *列出所有文件和目录(仅名字,不递归)
ls -d dir*/列出以 dir 开头的目录

这是一种简洁高效的方式,适用于大多数场景!



普通分类: