windows上的中文文件名上传到linux上乱码问题解决
至此,两种方法结合,问题基本搞定。部分文件夹中文名无法用convmv转码的原因,初步分析应该是来源和其它的不一样,但用python可以获取到原来的中文名,进行重命名即可解决。附上python批量转码的代码。convmv -r 应该是递归子文件夹,但仍存在部分子文件夹下文件名未进行转码,因此编写bash 脚本批量转码。windows上中文默认编码格式是gbk,而linux默认编码格式是utf-8,因
·
问题描述
有很多多层文件夹存放的数据保存在windows上,文件夹和文件名均含有中文,将这些文件目录传到linux上,中文名显示乱码。
问题分析
windows上中文默认编码格式是gbk,而linux默认编码格式是utf-8,因此需要将文件名转码。
解决过程
1、linux工具convmv
# yum install convmv
convmv -f gbk -t utf-8 -r --notest .(文件夹路径)
部分文件夹及文件中文名可正常显示,但仍有两个问题:
1、部分中文路径显示:正在跳过,已经是 utf8”,乱码字符并未改变;
2、部分子文件夹下文件并未成功转码,仍是乱码。
2、python
解决第一个问题:
name = '乱码字符' # 拷贝linux下的乱码字符
new_name = name.encode('utf-8').decode('gbk')
print(new_name) # 此时显示乱码字符的中文名称,在shell下重命名文件名即可,mv name new_name。
解决第二个问题:
convmv -r 应该是递归子文件夹,但仍存在部分子文件夹下文件名未进行转码,因此编写bash 脚本批量转码。
#!/bin/bash
func () {
local dir="$1"
for f in `ls $1`
do
if [ -f "$dir/$f" ]
then
echo "$dir/$f is file, pass"
elif [ -d "$dir/$f" ]
then
convmv -f gbk -t utf-8 -r --notest "$dir/$f/"
func "$dir/$f"
fi
done
}
func $1
./gbk2utf8.sh .(文件路径)
至此,两种方法结合,问题基本搞定。部分文件夹中文名无法用convmv转码的原因,初步分析应该是来源和其它的不一样,但用python可以获取到原来的中文名,进行重命名即可解决。附上python批量转码的代码。
def gbk2utf(dir_path):
for root, dirs, files in os.walk(dir_path, topdown=False):
for file_name in files:
new_name = file_name.encode('utf-8').decode('gbk')
new_path = os.path.join(root, new_name)
old_path = os.path.join(root, file_name)
os.rename(old_path, new_path)
for dir_name in dirs:
new_dir_name = dir_name.encode('utf-8').decode('gbk')
new_dir_path = os.path.join(root, new_dir_name)
old_dir_path = os.path.join(root, dir_name)
os.rename(old_dir_path, new_dir_path)
# 查询字符串的编码格式
# import chardet
# chardet.detect(s)
更多推荐
已为社区贡献2条内容
所有评论(0)