いくつかのテキストファイルで小さなbashスクリプトを実行しています。
find . -name "*.dat" -exec iconv --from-code='UTF-8' --to-code='ASCII//TRANSLIT' {} --output={} \;
私のコンピュータはUbuntu 14.04 LTSです。
しばらくすると、ファイル内のデータの半分が行/単語の途中で切り捨てられたように見えました。signal 7
(私の知る限り)ミステリーかコアダンプです。問題は、ファイルが大きすぎる場合に発生します。私のファイルのいくつかは60kBより大きかったが、iconv
結局約30kBになった。
この問題についてどうすればよいですか?これはバグですか?解決策はありますか?発音区別符号を音訳する他の便利な方法はありますか?
答え1
私の質問に対するコメントで指摘したように、問題は2つの条件が満たされたときに発生します。
- ソースファイルとターゲットファイルは同じです。
- ファイルが32768バイトより大きい。
2つの回避策があります。一時ファイルを変換し、ソースファイルを自動的に置き換えたり、recode
。
最初の回避策については例をご覧ください。https://unix.stackexchange.com/a/10243/94483。についてはsponge
SOに関する非常に良い質問があります(https://stackoverflow.com/q/64860/362146)ここへの答えは次のとおりです。https://unix.stackexchange.com/a/19980/94483
iconv
これで、より少ない数の文字セットをサポートするためにasを使用する予定ですrecode
(そしてこの機能も機能しませんでした)。
FILELIST=$(find . -type f -name "*.dat")
for file in $FILELIST
do
iconv --from-code='UTF-8' --to-code='ASCII//TRANSLIT' "$file" | sponge "$file"
done
sponge
交換作業を行います。からその他のユーティリティ。