39

latin1 エンコーディングの OSX で、この 1 つの PHP プロジェクトを使用しています。ここで、ファイルを UTF8 に変換する必要があります。私はあまりシェルコーダーではないので、インターネットから見つけたものを試しました:

mkdir new  
for a in `ls -R *`; do iconv -f iso-8859-1 -t utf-8 <"$a" >new/"$a" ; done

しかし、それではディレクトリ構造が作成されず、実行時に大量のエラーが発生します。誰でもきちんとした解決策を思い付くことができますか?

4

12 に答える 12

45

lsそのように使用するべきではなく、forループも適切ではありません。また、宛先ディレクトリはソース ディレクトリの外にある必要があります。

mkdir /path/to/destination
find . -type f -exec iconv -f iso-8859-1 -t utf-8 "{}" -o /path/to/destination/"{}" \;

ループは必要ありません。この-type fオプションは、ファイルを含め、ディレクトリを除外します。

編集:

の OS X バージョンにはオプションiconvがありません。-oこれを試して:

find . -type f -exec bash -c 'iconv -f iso-8859-1 -t utf-8 "{}" > /path/to/destination/"{}"' \;
于 2010-12-28T09:00:37.163 に答える
22

.phpこれにより、現在のディレクトリとそのサブディレクトリにあるファイル名拡張子を持つすべてのファイルが変換され、ディレクトリ構造が維持されます。

    find . -name "*.php" -exec sh -c "iconv -f ISO-8859-1 -t UTF-8 {} > {}.utf8"  \; -exec mv "{}".utf8 "{}" \;

ノート:

-exec事前に対象となるファイルのリストを取得するには、フラグを付けずにコマンドを実行します(次のように: find . -name "*.php")。バックアップを作成することをお勧めします。

このshように使用すると、-exec によるパイプとリダイレクトが可能になります。これは、iconv のすべてのバージョンが-oフラグをサポートしているわけではないため必要です。

出力のファイル名に追加.utf8してから削除するのは奇妙に思えるかもしれませんが、必要なことです。出力ファイルと入力ファイルに同じ名前を使用すると、次の問題が発生する可能性があります。

  • 大きなファイル (私の経験では約 30 KB) の場合、コア ダンプが発生します (またはtermination by signal 7)

  • iconv の一部のバージョンは、入力ファイルを読み取る前に出力ファイルを作成するようです。つまり、入力ファイルと出力ファイルが同じ名前の場合、入力ファイルは読み取られる前に空のファイルで上書きされます。

于 2014-07-19T02:33:58.497 に答える
21

いくつかの良い答えがありますが、変換する何百ものファイルのネストされたディレクトリを使用する場合、これははるかに簡単であることがわかりました。

警告: これによりファイルが所定の場所に書き込まれるため、バックアップを作成してください

$ vim $(find . -type f)

# in vim, go into command mode (:)
:set nomore
:bufdo set fileencoding=utf8 | w
于 2016-02-11T02:14:06.547 に答える
12

サブディレクトリの作成を含め、完全なディレクトリ ツリーを iso-8859-1 から utf-8 に再帰的に変換するには、ディレクトリ構造がターゲットに作成されていないため、上記の短い解決策はどれもうまくいきませんでした。Dennis Williamsons の回答に基づいて、次の解決策を思いつきました。

find . -type f -exec bash -c 't="/tmp/dest"; mkdir -p "$t/`dirname {}`"; iconv -f iso-8859-1 -t utf-8 "{}" > "$t/{}"' \;

すべてのサブディレクトリ/tmp/destを含み、すべてのiso-8859-1ファイルがutf-8. macosxでテスト済み。

ところで:ファイルのエンコーディングを確認してください:

file -I file.php

エンコード情報を取得します。

お役に立てれば。

于 2015-06-27T09:05:15.127 に答える
6

(i) ディレクトリ "converted" 内のすべての tex ファイルをバックアップし、(ii) すべての tex ファイルのエンコーディングをチェックし、(iii) ISO-8859-1 の tex ファイルのみを UTF-8 に変換する、次のスクリプトを作成します。エンコーディング。

FILES=*.tex
for f in $FILES
do
  filename="${f%.*}"
  echo -n "$f"
#file -I $f
  if file -I $f | grep -wq "iso-8859-1"
  then
    mkdir -p converted
    cp $f ./converted
    iconv -f ISO-8859-1 -t UTF-8 $f > "${filename}_utf8.tex"
    mv "${filename}_utf8.tex" $f
    echo ": CONVERTED TO UTF-8."
  else
    echo ": UTF-8 ALREADY."
  fi
done
于 2015-11-30T22:25:21.977 に答える
5

変換する必要があるすべてのファイルが .php である場合は、次を使用できます。これはデフォルトで再帰的です。

for a in $(find . -name "*.php"); do iconv -f iso-8859-1 -t utf-8 <"$a" >new/"$a" ; done

あなたのエラーはls -R、iconvによって有効なファイル名として認識されない可能性のある出力も生成されるという事実によるものだと思います。./my/dir/structure:

于 2010-12-28T08:45:18.260 に答える
1

mkdir -p "${a%/*}";iconv の前に使用します。

forファイル名にスペースが含まれている場合、潜在的に危険な構造を使用していることに注意してください。 http://porkmail.org/era/unix/award.htmlを参照してください。

于 2010-12-28T08:53:30.790 に答える
0

Dennis Williamson と Alberto Zaccagni の回答を使用して、すべてのサブディレクトリから指定されたファイル タイプのすべてのファイルを変換する次のスクリプトを思いつきました。出力は、次のように指定された 1 つのフォルダーに収集されます。/path/to/destination

mkdir /path/to/destination
for a in $(find . -name "*.php"); 
do 
        filename=$(basename $a);
        echo $filename
        iconv -f iso-8859-1 -t utf-8 <"$a" >"/path/to/destination/$filename"; 
done

関数 basename は、ファイルのパスなしでファイル名を返します。

代替 (ユーザー インタラクティブ): 古いファイルを上書きするか、単に名前を変更するかを決定できるユーザー インタラクティブ スクリプトも作成しました。追加の感謝はtbsallingに行きます

for a in $(find . -name "*.tex");
do
        iconv -f iso-8859-1 -t utf-8 <"$a" >"$a".utf8 ;
done
echo "Should the original files be replaced (Y/N)?"
read replace
if [ "$replace" == "Y" ]; then
    echo "Original files have been replaced."
    for a in $(find . -name "*.tex.utf8");
        do
            file_no_suffix=$(basename -s .tex.utf8 "$a");
            directory=$(dirname "$a");
            mv "$a" "$directory"/"$file_no_suffix".tex;
        done
else
        echo "Original files have been converted and converted files were saved with suffix '.utf8'"
fi

これを楽しんでください。それを改善するためのコメントに感謝します。ありがとう!

于 2015-04-15T08:32:39.853 に答える