linux中 为什么在通配符后加 / 后缀 能过滤掉其他非目录文件
目录文件的特点
-
只有当某个文件是一个目录文件时,才能在这个文件名后面加上
/。 -
例如:因为
work是目录文件,所以cd work和cd work/等价
路径的相关概念
- 什么是路径:描述的是如何到达某个位置,由
/分隔的一串名字,如:/var/log就是一个路径。
- 路径的终点:可以指向不同类型的文件对象,其中最关键的是目录与非目录文件
- 如果路径的终点是一个非目录文件,则不能继续向下追加新的层级,例如:
/var/log/kern.log - 如果路径的终点是一个目录文件,则路径可以继续向下扩展,例如:
/var/log/
- 如果路径的终点是一个非目录文件,则不能继续向下追加新的层级,例如:
通配符扩展特点
- 通配符可以匹配多级路径,而不仅仅是文件名。
- 例如:
ls Worker/*/Log/*-12-16,会在Worker目录下,匹配所有子目录中的Log目录,并进一步匹配其中以-12-16结尾的文件。所以通配符匹配的是路径结构,而不是单纯的字符串文件名。

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

总结:为什么加后缀能过滤非目录文件
根据以上的情况可以知道,通配符扩展后只会列出在文件系统上存在的文件,而且只有目录文件才能加/后缀,例如:*/ 时:
-
首先将通配符
*扩展为当前路径下的任意文件名 -
在匹配结果后追加
/,此时就变为了一个终点为目录的路径。 -
shell 会按照内核的路径解析规则验证该路径是否成立,成立了才会列出来,不成立自动过滤掉了,压根就不会打印出来,因为通配符展开后,生成的是一组真实存在、语义合法的路径。
非目录文件后面加/这种规则就不成立,所以就把非目录文件过滤掉了
例如:打印当前目录下的所有目录文件
for file in */ ; do
echo $file
done
浙公网安备 33010602011771号