最近在折腾使用树莓派做NAS,因为硬盘格式被我格式化成了Ext4的文件系统,所以需要在windows下读写Ext4文件系统的话,需要先安装Ext2Fsd来挂载Ext4,然后把文件拷贝到一块4T的红盘去的,但是在使用Ext2Fsd来挂载硬盘的时候,忘记选择utf-8编码了,导致编码处是:“自动”,于是在windows下编码就是GB2312的编码。

当把硬盘挂在到树莓派的系统中去的时候,GB2312的文件编码会变成一堆“?????”的形式了。

方法一:

首先想到的解决方法就是修改mount的设置项,修改编码为utf-8:

mount -o utf-8 /dev/sdb1 /data

但是发现-o 这个参数在Debain下居然没有,报错:

wrong fs type, bad option, bad superblock on /dev/sdb1, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so

方法一失败。

方法二:

好吧,既然修改mount的设置项不行,那么我们就检查系统语言的编码项,是否开启的是zh_CN.UTF-8,不行是再试试zh_CN.GB2312或者zh_CN.GBK

vim /etc/locale.gen #去掉zh_CN.UTF-8前的#号
sudo locale-gen
export LANG="zh_CN.UTF-8" #(也可以加到~/.bashrc,不用每次手工打)

但是很遗憾我尝试了,都不行,方法二失败。

方法三

既然方法一和二都不行,那么我们就只能想新的办法了,既然只是文件名称的编码错误,那么我们就转换文件的编码,不过这样有一个问题,我的硬盘里面有几万个文件,如果手工一个个来的转换的话,oh~,我会疯掉的~~ 我坚信一定有工具可以批量解决的,去找Google大叔吧~~~

Mr柿子: Google 大叔,Linux下有什么工具可以批量更改文件名编码的?

Google: 有啊,Linux是万能的。在Linux中专门提供了一种工具convmv进行文件名编码的转换,可以将文件名从GBK转换成UTF-8编码,或者从UTF-8转换到GBK。

Mr柿子: 吼吼~,那么好,那么在哪里可以下载到呢?

Google: 你使用的是Debain吧?那么直接sudo apt-get install convmv来安装啊。

Mr柿子: Ok,Thanks.

好了,既然工具找到了,我们来看看用法:

convmv -f 现有文件编码 -t 新的编码 [选项] 文件名

一些参数解释: -r 是递归处理子文件夹(要的就是这个功能,耶~) –notest 真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。 –list 显示出来所有支持的编码 –unescap 用来做一下转义,比如把%20变成空格的

那么我们来转换,我需要把GBK编码的文件名,转换成UTF-8编码,那么写一个Shell脚本文件来帮我们执行吧。

#!/bin/sh

for i in `ls`
do
  convmv -f GBK -t UTF-8 –notest $i;
done

对了,还有一个⚠️警告。

千万不要在NTFS和FAT的文件系统中使用这个命令哦,否则可能产生意外结果。 如果要在Linux中正确的显示NTFS和FAT的中文件名,可以通过mount参数来解决,参考方案二