web-dev-qa-db-ja.com

フォルダーおよびそのサブフォルダー内のすべての単一の.txtファイルのエンコードを変更する

多くのtxtファイルを含む多くのtxtファイルとサブフォルダーを含むフォルダーがあります。

すべてのファイルのエンコーディングを自動的に変更したい。今、私はコマンドを使用して1つのファイルを変更する方法を知っています:

iconv -f gbk -t utf8 sample.txt > sample.wiki

変更されていないファイルの名前と拡張子を.wikiに変更する必要があります。どうすれば自動的にこれを達成できますか?

.txtファイルを反復処理し、エンコードを変更し、iconv.wikiオプションを使用して同じ名前の-oファイルに出力を保存し、成功した場合は関連する.txtファイル:

shopt -s globstar  ## Enables recursive glob matching
for f in **/*.txt; do
    iconv -f gbk -t utf8 -o "${f%.txt}".wiki "$f" && rm "$f"
done

注意:

入力ファイルが指定されたソースエンコーディングにない場合、または既にターゲットエンコーディングにある場合、iconvは操作を行わずにtrueを返すため、.wikiファイルは作成されず、.txtファイル削除されます。

これを回避するには、変数に変換した後、STDOUTを保存します。変数が空でない場合のみ、.wikiファイルに出力を保存し、txtファイルを削除します。

shopt -s globstar  ## Enables recursive glob matching
for f in **/*.txt; do
    out="$(iconv -f gbk -t utf8 "$f")" 
    [[ -n $out ]] && echo "$out" >"${f%.txt}".wiki && rm "$f"
done
4
heemayl