为何Linux通配符(*)在mkdir命令中无法正常工作?
Linux通配符在mkdir等命令中失效的问题
问题场景
终端操作记录如下:
[trainee@esem-linux-jump ~]$ ls mydir [trainee@esem-linux-jump ~]$ ls my* list1 list2 shell_code [trainee@esem-linux-jump ~]$ mkdir my*/abc mkdir: cannot create directory ‘my*/abc’: No such file or directory [trainee@esem-linux-jump ~]$ rmdir my*/shel* [trainee@esem-linux-jump ~]$ ls my* list1 list2
可见ls、rmdir能正常解析my*通配符,但mkdir却报错无法识别。
原因分析
核心问题在于对shell通配符匹配逻辑的误解:
- 执行
ls my*时,shell会先将my*扩展为当前目录下所有以my开头的文件/目录(此处为mydir),实际执行的是ls mydir,显示的是mydir内部的内容。 - 执行
mkdir my*/abc时,若通配符未被正确扩展,大概率是以下情况:- 目录名含特殊字符(如空格、隐藏字符),导致
my*无法完整匹配mydir; - 极少数情况下shell的通配符扩展规则被修改(如开启
failglob选项,匹配失败时直接报错而非保留原模式)。
- 目录名含特殊字符(如空格、隐藏字符),导致
解决方法
- 验证通配符匹配结果:先执行
echo my*查看shell实际扩展后的内容,确认是否正确匹配到mydir:
若输出为echo my*mydir,说明通配符正常,可直接执行mkdir mydir/abc;若输出为my*,则需检查目录名称是否存在特殊字符。 - 显式指定路径:避免依赖通配符,直接写出完整路径:
mkdir mydir/abc - 批量创建子目录的正确写法:如果需要给多个
my开头的目录创建子目录,用循环实现:for dir in my*; do mkdir "$dir"/abc; done
内容的提问来源于stack exchange,提问作者Gaurav kumar Khandelwal
相关产品推荐
相关产品推荐

