linux中 为什么在通配符后加 / 后缀 能过滤掉其他非目录文件

目录文件的特点

  • 只有当某个文件是一个目录文件时,才能在这个文件名后面加上 /

  • 例如:因为 work 是目录文件,所以 cd workcd work/ 等价


路径的相关概念

  • 什么是路径:描述的是如何到达某个位置,由 / 分隔的一串名字,如:/var/log 就是一个路径。

  • 路径的终点:可以指向不同类型的文件对象,其中最关键的是目录与非目录文件
    • 如果路径的终点是一个非目录文件,则不能继续向下追加新的层级,例如:/var/log/kern.log
    • 如果路径的终点是一个目录文件,则路径可以继续向下扩展,例如:/var/log/

通配符扩展特点

  1. 通配符可以匹配多级路径,而不仅仅是文件名。
  • 例如:ls Worker/*/Log/*-12-16,会在 Worker 目录下,匹配所有子目录中的 Log 目录,并进一步匹配其中以 -12-16 结尾的文件。所以通配符匹配的是路径结构,而不是单纯的字符串文件名。

  1. 通配符展开后的结果必须在文件系统中真实存在。
  • 例如:echo /var/log/*.fdsafsdafasd,由于 /var/log 目录下不存在以 .fdsfsdafsad 结尾的文件,在通配符展开阶段就无法匹配到任何合法路径,因此不会生成匹配结果。所以会发现原样输出了(/var/log/*.fdsafsdafasd),通配符 * 没有展开。

总结:为什么加后缀能过滤非目录文件

根据以上的情况可以知道,通配符扩展后只会列出在文件系统上存在的文件,而且只有目录文件才能加/后缀,例如:*/ 时:

  • 首先将通配符 * 扩展为当前路径下的任意文件名

  • 在匹配结果后追加 / ,此时就变为了一个终点为目录的路径。

  • shell 会按照内核的路径解析规则验证该路径是否成立,成立了才会列出来,不成立自动过滤掉了,压根就不会打印出来,因为通配符展开后,生成的是一组真实存在、语义合法的路径。

非目录文件后面加/这种规则就不成立,所以就把非目录文件过滤掉了


例如:打印当前目录下的所有目录文件

for file in */ ; do
    echo $file
done

posted on 2025-12-16 10:30  一直小爪子  阅读(2)  评论(0)    收藏  举报