Linux下执行Shell脚本创建含通配符*的目录在Windows 10中显示乱码的问题咨询
问题原因与解决办法
为什么会出现乱码?
这本质是Windows和Linux的文件名规则差异导致的,和中文字符集关系不大:
- Windows的NTFS/VFAT文件系统把
*、?、:这类字符列为非法文件名字符,根本不允许出现在文件名里 - 但Linux的文件系统(比如ext4)对文件名的限制宽松得多,允许这些字符存在。当你在Linux下创建带
*的目录(不管是双系统共享的NTFS分区,还是通过SMB共享给Windows访问),Windows读取时无法识别这些非法字符,就会自动生成8.3短文件名来替代显示——也就是你看到的_2X68P~X.A这类乱码格式,这是Windows的 fallback 机制。
怎么解决?
分两种场景处理:
1. 已经创建的乱码目录(恢复正常显示)
别在Windows下直接改这些乱码目录名,容易搞出文件损坏的问题。回到Linux系统,用批量重命名命令把*替换成Windows支持的字符,比如star或者-:
# 批量替换所有含*的目录名,把*换成star for dir in *\**; do mv "$dir" "${dir//\*/star}"; done
执行完之后,Windows端刷新一下就能看到正常的目录名了。
2. 未来创建目录(从根源避免问题)
修改你的Shell脚本,提前把*转换成Windows合法的字符再创建目录:
#!/bin/sh DOMAINLIST='*.io.domain.fun io.domain.fun *.*.domain.fun' for i in $DOMAINLIST do # 把*替换为star,你也可以换成其他符合需求的合法字符 safe_dirname="${i//\*/star}" mkdir "$safe_dirname" done
这样创建的目录在Linux和Windows下都能正常显示,不会再出现乱码。
额外优化(SMB共享场景)
如果是通过SMB共享让Windows访问Linux目录,还可以在Samba配置文件/etc/samba/smb.conf里添加参数,让Samba自动处理非法字符:
[your_share_name] # 其他已有配置... # 开启非法字符自动转换 mangled names = yes
开启这个选项后,Samba会自动把Windows不允许的字符替换成合法格式,不用手动改脚本也能避免乱码。
内容的提问来源于stack exchange,提问作者bloodkey
相关产品推荐
相关产品推荐

