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 并不知道这不是本地路径,所以会尝试在本地展开这个通配符。

解决方法

  1. 加转义符 \* 或用单引号/双引号包裹:

    • 转义星号:
      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 上处理通配符。

  2. 关闭 zsh 的 NOMATCH 检查(不推荐,影响全局):

    setopt +o nomatch
    

    这样写就算没有匹配也不会报错,但不建议长期设置。


总结

  • zsh(和 bash)会先尝试本地展开通配符,如果找不到匹配项就报错。
  • 加转义符或用引号包裹可以避免本地展开,把通配符原样传给下游命令。
  • 这在 Hadoop/HDFS、S3 等远程文件系统命令中很常见。

如还有疑问,欢迎继续提问!

posted @ 2025-06-17 15:21  Gold_stein  阅读(74)  评论(0)    收藏  举报