ファイル名を別のエンコーディングに変更するにはどうすればよいですか?


8

マウントされたハードドライブfile nameに3種類のエンコーディングがありますreiserfs:CP1251、KOI-8、UTF-8、ASCII。すべてのエンコーディングを再帰的にUTF-8に変換する必要があります。ソースエンコーディングを検出してUTF-8に変換するユーティリティはありますか、それともPythonスクリプトを記述する必要がありますか?


一般的なケースでは、名前のエンコーディングを自動的に「推測」することはできません(たとえば、ほとんどのバイトシーケンスは有効なKOI-8およびCP1251(ただし差分)ファイル名です)。名前のエンコーディングを知る手がかりはありますか?

他の手がかりはありません:(
Pablo

小文字と大文字の両方のファイル名がありますか?

はい、小文字と(すべて)の両方のファイル名を持っています。
Pablo

困っている人はいますか?チェックしてくださいdetox。ISO-8859-1とUTF-8の間で次の方法を使用して動作しました-s iso8859_1-only
Alwin Kesler

回答:


12

異なるエンコーディング間でファイル名を変換するCLIツールであるconvmvを使用します。-fこれらのエンコーディングを(-t)から()UTF-8に変換するには、次のようにします。

convmv -f CP1251 -t UTF-8 inputfile
convmv -f KOI-8  -t UTF-8 inputfile
convmv -f ASCII  -t UTF-8 inputfile

また、ファイルコンテンツを変換する場合iconvは、CLIツールのを使用して、ファイルコンテンツを別のエンコーディングに変換します。-fこれらのエンコーディングを(-t)から()UTF-8に変換するには、次のようにします。

iconv -f CP1251 -t UTF-8 inputfile > outputfile
iconv -f KOI-8  -t UTF-8 inputfile > outputfile
iconv -f ASCII  -t UTF-8 inputfile > outputfile

1
変換する必要があるのはファイルの内容ではなく、ファイル名自体
Pablo

はい。convmvを試しましたか?
Marcos Roriz Junior 2015

ASCIIはすでにUTF-8のサブセットであるため、変換する必要はありません。
psusi

1

いいえ。古いコードページシステムの大きな欠点の1つは、どちらが使用されているかを検出する方法がないことです。あなたは単にそのアプリオリを知っている必要があります。どのファイルがどのエンコーディングを使用しているかがわかっている場合は、次のようなものを使用して名前を変換できます。

mv somefile `echo somefile | iconv -f CP1251 -t UTF-8`

手動で名前を変更するにはファイルが多すぎます...コードページには異なる文字コード範囲があると思いました。
Pablo

@Pablo、いいえ、それが全体のポイントです。8ビットのバイトでは、256の可能な文字コードしかありませんでした。通常のASCII文字と制御コードのセットを差し引いた後、追加のコード用に128が残りますが、これはすべての言語のすべての文字を表すのに十分ではありません。各コードページは、それらの上位128コードを独自に使用して、ユーザーにとって重要な文字を表します。使用されているコードページを表示する唯一の方法は、考えられる各コードページを表示して、名前が意味をなしているかどうかを確認し、それがコンピューターではなく決定することです。
psusi

まあ、Python chardetが何らかの形でそれを検出している...
Pablo

@パブロ、きちんと...それは書かれた言語でのさまざまな文字の普及に基づいて、知識に基づいた推測をするように見えます。言い換えると、間抜けなグリフなどの特定の文字がアクセント付きの「a」よりも人気が低いと想定し、各コードページの文字を解釈して、より人気のある文字と一致するコードが最も多い文字を見つけます。ただし、特にファイル名などの文字数が少ない場合は、正確ではない可能性があります。
psusi

0

iconv@psusi と同じソリューションですが、ループとwhileカードを使用します。

また、1行のシェルshスクリプト:

for f in /path/*.txt; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done

パイプラインからwhileカードを読み取る場合:

echo * | for f in `read f&&echo $f`; do mv $f `echo $f | iconv -f 866 -t UTF-8`; done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.