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

这里的技术是共享的

You are here

linux 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 开头的目录

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


ls -ld /software/* 与 ls -ld /software/*/ 区别

ls -ld /software/* 和 ls -ld /software/*/ 命令的区别在于通配符 * 的匹配范围和后缀斜杠 / 的影响,具体如下:


1. 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
    

    (包含文件和目录)


2. 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 递归列出目录内容,但它 并不会限制通配符 * 的匹配范围

为什么会显示文件?

  1. -d 的作用

  • 默认情况下:如果 ls 的参数是一个目录(如 /software/app1),ls 会显示该目录下的内容(例如 /software/app1/file1)。

  • -d 的作用:让 ls 只显示目录本身(而非其内容)。
    例如:

    bash
    ls -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 # 文件
    
    1. 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 等工具。例如:

      bash
      ls -d */          # 仅当前目录的子目录 find /software -maxdepth 1 -type d  # 仅列出目录



    普通分类: