shell命令通配符展开
你的问题是:
为什么这个命令不在通配符前面加转义符就会报错?
命令如下:
hope dfs -rm -f -r viewfs://hadoop-meituan/user/hadoop-hdp-mlp/xiaoyumeng/torch/torch_model/20250527/*
报错:
zsh: no matches found: viewfs://hadoop-meituan/user/hadoop-hdp-mlp/xiaoyumeng/torch/torch_model/20250527/*
加了转义符\*就不报错。
原因解析
这是 zsh shell 的特性(bash 也类似,但行为略有差异):
- 当你在命令中写
*这样的通配符时,zsh 默认会在本地文件系统上做一次通配符展开(叫做“globbing”)。 - 如果你指定的路径(比如
viewfs://.../20250527/*)在本地文件系统里并不存在,zsh 就会报错no matches found。
注意:
viewfs://...是 Hadoop/HDFS 的路径,zsh 并不知道这不是本地路径,所以会尝试在本地展开这个通配符。
解决方法
-
加转义符
\*或用单引号/双引号包裹:- 转义星号:
hope dfs -rm -f -r viewfs://hadoop-meituan/user/hadoop-hdp-mlp/xiaoyumeng/torch/torch_model/20250527/\* - 或者用单引号(推荐):
hope dfs -rm -f -r 'viewfs://hadoop-meituan/user/hadoop-hdp-mlp/xiaoyumeng/torch/torch_model/20250527/*' - 或者用双引号:
hope dfs -rm -f -r "viewfs://hadoop-meituan/user/hadoop-hdp-mlp/xiaoyumeng/torch/torch_model/20250527/*"
这样,shell 就不会在本地进行通配符展开,而是把
*原样传递给hope dfs命令,由hope dfs在 HDFS 上处理通配符。 - 转义星号:
-
关闭 zsh 的 NOMATCH 检查(不推荐,影响全局):
setopt +o nomatch这样写就算没有匹配也不会报错,但不建议长期设置。
总结
- zsh(和 bash)会先尝试本地展开通配符,如果找不到匹配项就报错。
- 加转义符或用引号包裹可以避免本地展开,把通配符原样传给下游命令。
- 这在 Hadoop/HDFS、S3 等远程文件系统命令中很常见。
如还有疑问,欢迎继续提问!

浙公网安备 33010602011771号