Linux find命令-name参数匹配含特殊字符文件的问题求助
解决
find命令中*release模式无法匹配文件的问题 这个问题的核心是shell的通配符扩展优先级高于find命令的匹配逻辑,咱们一步步拆解清楚:
为什么会出现这种差异?
当你执行不带引号的find /etc -name *-release时:
- 如果当前工作目录里没有符合
*-release模式的文件,shell会直接把*-release原封不动传给find,此时find会在/etc目录下匹配所有以-release结尾的文件名,所以能找到/etc/lsb-release这类文件。
但当你执行find /etc -name *release时:
- 如果当前目录存在任何以
release结尾的文件(比如你当前目录有个叫testrelease的文件),shell会先把*release扩展成这些具体文件名,传给find的就不再是匹配模式了。find会去/etc目录找这些指定的文件名,自然找不到,所以输出为空。
正确的解决方法
把find的匹配模式用单引号或双引号括起来,阻止shell提前扩展通配符,让find自己处理文件名匹配:
单引号版本(推荐,避免shell解析任何特殊字符)
find /etc -name '*release' 2>/dev/null
双引号版本
find /etc -name "*release" 2>/dev/null
执行后就能得到所有名称以release结尾的文件,不管文件名里有没有-或其他特殊字符:
test@host:~$ find /etc -name '*release' 2>/dev/null /etc/lsb-release /etc/update-manager/meta-release /etc/os-release
额外提示
- 所有
find的-name匹配模式,只要包含通配符(*、?、[]),都建议用引号括起来,避免shell提前扩展导致不符合预期的结果。 2>/dev/null是用来屏蔽权限不足的错误信息,不影响核心功能,可以根据需要保留或移除。
内容的提问来源于stack exchange,提问作者serhattsnmz
相关产品推荐
相关产品推荐

