zip壓縮包中的文件名編碼跟隨系統設定,但zip文件中不會記錄文件名編碼,在windows中打包zip,放到linux中解壓時,解壓程序並不會自動轉換文件名編碼,因此會出現文件名亂碼。解決這個問題的方法是讓解壓程序保留原始文件名,解壓完畢后再轉換編碼。
我使用7z作為解壓程序,因為7z對超過2GB的壓縮包有很好的支持,而tar、unzip等都不支持超過2GB的文件。安裝7z:
$ sudo apt-get install p7zip-full
然后設置系統編碼:
$ export LANG=C
解壓zip文件:
$ 7za x /path/to/zip
解壓之后在gui文件管理器中可能會看到文件名后面出現(invalid encoding)的后綴,不用管它,使用ls命令看到的文件名是沒有那個后綴的。
然后使用convmv轉換編碼。安裝convmv:
$ sudo apt-get install convmv
convmv支持的部分參數如下:
-f 源編碼
-f 目標編碼
--notest convmv默認只會顯示文件名轉換后的結果而不會實際進行轉換。使用這個參數使convmv對文件名進行實際的編碼轉換。
--list 列出convmv支持的所有編碼
-r 遞歸轉換所有子目錄的文件名編碼
轉換:
$ convmv -f cp936 -t utf8 --notest /path/to/file
cp936是gbk編碼在windows里的別稱。