如何删除文件名含异常Unicode字符且find命令无效的文件?
如何删除文件名含异常Unicode字符且find命令无效的文件?
看起来你遇到的是Linux与HFS+文件系统的字符编码兼容问题——HFS+使用UTF-16编码存储文件名,而Ubuntu默认用UTF-8,导致文件名里的异常Unicode字符无法被系统正确解析,常规的rm、find命令因为识别不了文件名而失败。不过好在你已经拿到了文件的inode(唯一标识文件的编号),我们可以绕开文件名,直接通过inode来操作文件。
下面给你几个可行的解决方案,按优先级排序:
方案1:重新挂载HFS+分区,修复编码识别问题
先尝试让系统正确识别文件名,这样后续操作会更简单:
- 首先卸载当前挂载的分区:
sudo umount /media/dot_sent/MacHD - 重新挂载时指定HFS+的原生编码UTF-16(先加
ro只读模式避免意外,确认可行后再改rw):
(替换sudo mount -t hfsplus -o charset=utf16,ro /dev/你的分区设备名 /media/dot_sent/MacHD/dev/你的分区设备名为实际路径,比如/dev/sdb2,可以用lsblk命令查看) - 挂载完成后,再尝试用常规命令删除:
或者用find按inode删除:rm "/media/dot_sent/MacHD/Users/<snip>/англ3/КОГДА ❓ ??.docx"find /media/dot_sent/MacHD/Users/<snip>/англ3 -inum 8215743 -delete
方案2:用Perl绕开文件名直接删除(最可靠的方法)
如果重新挂载还是不行,Perl的文件操作可以直接通过inode匹配文件,完全不需要依赖系统对文件名的解析:
- 先进入目标文件所在的目录:
cd /media/dot_sent/MacHD/Users/<snip>/англ3 - 执行下面的Perl命令,把
8215743替换成你拿到的inode号:
这个命令会遍历当前目录下的所有文件,通过perl -e 'for (<*>) { unlink if (stat)[1] == 8215743 }'stat获取每个文件的inode,匹配到目标inode后直接删除,完全不受乱码文件名的影响。
方案3:尝试用rm的--参数避免解析问题
有时候系统会把文件名中的特殊字符误判为命令选项,加上--可以明确告诉rm后面的内容都是文件名:
find . -inum 8215743 -exec rm -- {} \;
这个方法不一定能解决编码问题,但可以排除选项解析的干扰,值得一试。
备注:内容来源于stack exchange,提问作者Sergii Kudriavtsev
相关产品推荐
相关产品推荐

