zipファイルのストリームとして保存されたファイル名の非ASCII文字に関連するいくつかの問題があります(ヘブライ人、中国人、日本語でも韓国語でも)。ただし、提供されているソリューションのどれも、Windowsコンピュータでキリル文字を含むzipファイルを処理するのに役立ちませんでした。
ファイル自体にはキリル文字名(コスモス.zip- ダウンロード可能なリンク)。これは説明目的でのみ長さ0のコンテンツのアーカイブです。
unzip -l
印刷:
Archive: Космос.zip
Length Date Time Name
--------- ---------- ----- ----
0 2017-05-03 18:19 ɫ�����/ict_inf.pdf
--------- -------
0 1 file
Uglyはɫ�����
一連のバイトを表しますC9 AB DF E8 AB DF BC AB DF
。
私は(Gmailのプレビュー機能を使用して)これになる必要があることを知っています。
Archive: Космос.zip
Length Date Time Name
--------- ---------- ----- ----
0 2017-05-03 18:19 РосКосмос/ict_inf.pdf
--------- -------
0 1 file
これが私たちがマッピングしなければならないことC9 AB DF E8 AB DF BC AB DF
ですРосКосмос
。
一般的に使用される8ビットキリル文字エンコーディングには、CP1251、CP866、ISO8859-5などがありますが、これらはこの単語を別のバイトシーケンスにエンコードします。
Р о с К о с м о с
CP866: 90 AE E1 8A AE E1 AC AE E1
CP1251: D0 EE F1 CA EE F1 EC EE F1
ISO8859-5: C0 DE E1 BA DE E1 DC DE E1
明らかに、一般的に使用される8ビットキリル文字エンコーディングのどれも、入力名をそのような出力名にデコードしません。これにはもっと複雑なことがあります。
find
名前をデコードする方法がわかっている場合は、適切なスクリプト(https://unix.stackexchange.com/a/252000/17649)、例えば
find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | here-goes-the-decoding pipeline )"' sh {} \;
またはコンバージョン率便利です。
ベストアンサー1
私は1996年以来、オープンソースのソフトウェアと技術を専門的に扱う人気のあるロシアのリソースであるOpenNET.ruフォーラムでソリューションを見つけました。OpenNETに公開Info-ZIPは、かつてMS-DOSを実行しているコンピュータでZIPアーカイブを処理するために広く使用されているツールでした。 MS-DOS には CP850 という 1 つの 8 ビットエンコーディングしかないため、すべてのファイル名が自動的にCP850->CP1252
変換されました。 CP1252は、おそらくISO-8859-1文字セットの最も広く使用されているエンコード近似として選択されます。
したがって、キリル文字ファイル名を含むアーカイブを抽出した後に実行する正しい find コマンドは、次のようになります。
find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | iconv -f cp1252 -t cp850 | iconv -f cp866 )"' sh {} \;
興味深いことに、CP1252を使用せずにISO-8859-1を使用することをお勧めします。iconv -f iso8859-1 -t cp850
変換は成功したが変換が失敗したアーカイブの一部に会ったため、これは本当ではないようですiconv -f cp1252 -t cp850
。
単一の役割に戻る
Р о с К о с м о с
CP866: 90 AE E1 8A AE E1 AC AE E1
CP850 - > CP1252を適用すると、結果はC9 AB DF E8 AB DF BC AB DF
私たちが観察した順序と正確に一致します。
もう一つの便利なコマンドは
unzip -l РосКосмос.zip | grep -aEv '^Archive:' | iconv -f iso8859-1 -t cp850 | iconv -f cp866
アーカイブからファイルリストをインポートする
Length Date Time Name
--------- ---------- ----- ----
0 2017-05-03 18:19 РосКосмос/ict_inf.pdf
--------- -------
0 1 file
次に始まる行をフィルタリングするArchive:
ことは、アーカイブ名を変換から隠すための保護措置です。