ディレクトリ内のすべての* .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
)を追加せず、危険にさらしたい場合があります。tr
sed 's/long input text/shorter text/'
その場でファイルを修正(ここで言及されている他の解決策は新しい出力ファイルを生成して最後の場所に移動するため、何らかの理由でコマンドが中断されても元のデータは変わりません。)