ファイル名の文字化けについて
Windows で圧縮したファイルを Linux で解凍すると、日本語を含むファイル名が文字化けすることが起こります。
逆の Linux -> Windows の場合でも同様です。
この事象は、ファイル圧縮時におけるファイル名のエンコード方法の違いに起因します:
- Linux: UTF-8
- Windows: CP932 (Shift JIS)
Linux で解凍する際に文字化けをコマンドラインで解決するための方法を記述します。
使用した環境は OS が Arch Linux ベースの Manjaro で デスクトップが Cinnamon です。
How To: Linux コマンドで解決する
#1. unar
おすすめの方法です。
圧縮ファイルの解凍とファイル名の解決を 1 ラインで実現する方法です:
$ unar 圧縮ファイル.zip
圧縮ファイル.zip: Zip
圧縮ファイル/ (dir)... OK.
圧縮ファイル/ファイル (xxxxx B)... OK.
...
Successfully extracted to "./圧縮ファイル".
コマンド名の由来は "Unar"chiver です。
便利なのですが、使う機会が少ないため、私はコマンド名自体を忘れがちです...。苦笑
それを差し引いても、エンコードの指定が操作者側で不要であるため、非常に便利です。
パスワードが掛けられている場合、適宜、コンソールで聞いて来てくれます。
私は主にこちらの方法を使っています。
#2. unzip
+ convmv
まず unzip
でファイルを解凍して:
$ unzip 圧縮ファイル.zip
Archive: 圧縮ファイル.zip
creating: ���.../
inflating: ���.../������......
...
その後に convmv
で、ファイルを一つずつ処理して、ファイル名を変換して行く方法です:
$ convmv --notest -f shift_jis -t utf-8 ���.../������......
ここで --notest
オプションを除いて実行した場合は、ファイル名がどのように変換されるかを標準出力に表示してくれますが、実際のファイル名の変換は行われ無くなります。
convmv
自体は Linux -> Windows へのファイル送付時にも活躍してくれます。
エンコーディングの指定誤りによるのか、環境内の言語情報によるものなのか、はたまたもともとのファイル情報に起因するのか、今回検証したファイルではうまく行きませんでした。
#3. 7za
7-Zip を利用した解凍方法です。
ファイル名のエンコーディングを -scs
オプションで指定することが必要です。
それ以外はシンプルに実行できます。
$ # Windows
$ 7za x -scsWIN 圧縮ファイル.zip
$ # DOS
$ 7za x -scsDOS 圧縮ファイル.zip
$ # CP932
$ 7za x -scs932 圧縮ファイル.zip
ただしこちらも、#2. と同様、私の環境下では、うまく行きませんでした。
#参考情報. 複数ファイルの一括処理
#2 のように、複数ファイルに対してコマンドをそれぞれ実行する必要がある場合、シェルの反復処理を使用することで、効率化できます:
$ # fish シェルの場合:
$ for x in ���.../*; convmv --notest -f utf-8 -t shift_jis $x; end