2017-05-16 19 views
1

Heey私はfindコマンドを使用してUbuntuの新しいファイルを作成しようとしています。非UTF-8ファイルとUTF-8-BOMファイルをUTF-8に一括変換する

私はファイルを簡単にリストすることができますが、そこから新しいファイルを作成する方法はわかりますが、エンコードには必要ありません。

は、今私は、このコマンドを使用しています。ファイルはUTF-8形式ではない例えばある場合find ./Polish\ 2\ \(copy\)/ -name '*.txt' -type f -exec sh -c 'cat <"$0" >"$0.txt"' {} \;は は、しかし、私はまだUTF-8形式で新しいファイル$0.txtを書きたいと思います。

私は私がこの手でやっている時はいつでもので、このアイデアに出くわしました:

  1. 私はgeditの中nonUTF8ファイルを開きます。
  2. 内容をコピーします。
  3. 新しい空白ファイルを作成します。
  4. geditで開きます。
  5. ファイルにコピーした内容を貼り付け、geditのデフォルトの動作は、私の場合にはUTF8に保存されて

を保存します。しかし、これを行うには30,000以上のファイルがあります。私はこれを手動で行いたくありません。

デフォルトの組み込みツールを備えたソリューションはありますか?

EDIT

ファイルではなく、私は私の例で行ったように別々のファイルを作成する場で編集することができます。

iconvでファイルを変換しようとしたときに、ファイルが既にUTF-8形式の場合はどうなりますか?私はBOM

答えて

2

せず、最終的にすべてのファイルを持ってみたい

EDIT 2.0

あり一人で、その内容により、ファイルの文字エンコーディングを識別するための明確な方法でませんので、あなたができる最善でありますiconvを使用して、UTF-8に変換するときに、最大でと思われるように、入力エンコーディング(CP1252、あなたが述べているように)を仮定します。すでにはUTF-8でエンコードされたファイルを変換避けるために、あなたはそれらを検出するためにfileを使用することができます。

注:簡単にするために、私は.

find . -type f -name '*.txt' -exec bash -c ' 
    descr=$(file -b "$0") 
    if [[ $descr != *UTF-8* ]]; then 
    iconv -f CP1252 -t UTF-8 "$0" > "$0.$$" && mv "$0.$$" "$0" 
    elif [[ $descr == *"with BOM"* ]]; then 
    tail -c +4 "$0" > "$0.$$" && mv "$0.$$" "$0" 
    fi 
' {} \; 
findのターゲットディレクトリを変更しました

注:シングルライン -statementにこのコマンドを変換する場合、あなたは、後すなわち追加;インスタンスを、必要があります
descr=...ステートメント、iconv ...ステートメント、およびtail ...ステートメント。

注:

  • file-bオプションは、POSIXに準拠していないと標準は、出力にファイルのエンコーディングまたはBOMの有無に言及規定していません。
    しかしながら、上記はLinuxとmacOS/BSDシステムの両方で動作するはずです。

  • UTF-8 "BOM"(Unicodeの署名、のWindowsに主に使用されるような)3バイト長であるので、それは-fileを介して入力ファイルで検出された場合、tail -c +4」は出力、それをスキップBOM-less "UTF-8ファイルを作成します。

関連する問題