iconvに入力ファイルを変換された出力に置き換えさせるにはどうすればよいですか?

iconvに入力ファイルを変換された出力に置き換えさせるにはどうすればよいですか?

ディレクトリ内のすべての* .phpファイルを列挙して適用するbashスクリプトがありますiconv。これにより、STDOUTとして出力が表示されます。

私の経験では、パラメータを追加すると、-o変換が発生する前に実際に空のファイルが作成される可能性があるため、変換を実行してから入力ファイルを上書きするようにスクリプトを調整する必要がありますか?

for file in *.php
do
    iconv -f cp1251 -t utf8 "$file"
done

答え1

iconv出力ファイルが最初に作成され(ファイルが既に存在するため切り捨てられ)、入力ファイル(現在は空です)を読み始めるため、この方法は機能しません。これがほとんどのプログラムが動作する方法です。

出力用の新しい一時ファイルを作成し、その場所に移動します。

for file in *.php
do
    iconv -f cp1251 -t utf8 -o "$file.new" "$file" &&
    mv -f "$file.new" "$file"
done

プラットフォームiconvにない場合は、-oシェルリダイレクトを使用して同じ効果を得ることができます。

for file in *.php
do
    iconv -f cp1251 -t utf8 "$file" >"$file.new" &&
    mv -f "$file.new" "$file"
done

コリンワトソンのspongeユーティリティ(付属Joey Hessのmoreutils)これを自動的に実行します。

for file in *.php
do
    iconv -f cp1251 -t utf8 "$file" | sponge "$file"
done

iconvこの回答はフィルタリングプログラムにのみ適用されません。いくつかの特別なケースは言及する価値があります:

  • GNU sedとPerlにはファイルを置き換えるオプションが-pあります。-i
  • ファイルが非常に大きい場合、フィルタはいくつかの部分だけを変更または削除し、アイテム(たとえば、、、、などgrep)を追加せず、危険にさらしたい場合があります。trsed 's/long input text/shorter text/'その場でファイルを修正(ここで言及されている他の解決策は新しい出力ファイルを生成して最後の場所に移動するため、何らかの理由でコマンドが中断されても元のデータは変わりません。)

答え2

またはrecodelibiconv ライブラリを使用していくつかの変換を実行します。その動作は入力ファイルを出力に置き換えることで、次のように動作します。

for file in *.php
do
    recode cp1251..utf8 "$file"
done

複数の入力ファイルが引数として受け入れられるため、ループをrecode保存できますfor

recode cp1251..utf8 *.php

答え3

現在

find . -name '*.php' -exec iconv -f CP1251 -t UTF-8 {} -o {} \;

奇跡的に効果的

答え4

ここに一つあります。簡単な例。始めるのに十分な情報を提供する必要があります。

#!/bin/bash
#conversor.sh
#Author.....: dede.exe
#E-mail.....: [email protected]
#Description: Convert all files to a another format
#             It's not a safe way to do it...
#             Just a desperate script to save my life...
#             Use it such a last resort...

to_format="utf8"
file_pattern="*.java"

files=`find . -name "${file_pattern}"`

echo "==================== CONVERTING ===================="

#Try convert all files in the structure
for file_name in ${files}
do
        #Get file format
        file_format=`file $file_name --mime-encoding | cut -d":" -f2 | sed -e 's/ //g'`

        if [ $file_format != $to_format ]; then

                file_tmp="${unit_file}.tmp"

                #Rename the file to a temporary file
                mv $file_name $file_tmp

                #Create a new file with a new format.
                iconv -f $file_format -t $to_format $file_tmp > $file_name

                #Remove the temporary file
                rm $file_tmp

                echo "File Name...: $file_name"
                echo "From Format.: $file_format"
                echo "To Format...: $to_format"
                echo "---------------------------------------------------"

        fi
done;

関連情報