up:: Shellscript
iconvで可能。文字コードを自動判別したいならfileかnkf。
nkfはtermuxだとパッケージ無いのでビルドからになる。
今回完成した一例。
find . -iname *.csv -or -iname *.erb -print0 | xargs -0 -I {} nkf -w --overwrite {}
eraは大文字小文字が混在してるので注意。
なぜかutf-8をutf-8にすると全角¥が半角\になって帰ってきてバグる。
なのでもう一例。
nkf -g *.csv | xargs -I {} [ '{}' = 'Shift_JIS' ] && (nkf -w --overwrite 顔.csv) || (:)
……うん無理。空白が切れたり切れなかったり難しすぎ。
(xargsの仕様)
https://qiita.com/ko1nksm/items/34cd96d39c2c5cd80eb4
というわけでbingの力を借りて出来たのがこれ。
#!/bin/bash
find . -type f -iname "*.csv" -or -iname "*.erb" | while read file; do
encoding=$(nkf -g "$file")
if [ "$encoding" = "Shift_JIS" ]; then
nkf -w --overwrite "$file"
fi
done
検索結果をwhile readで一行ずつ入れ、予期しないバグを防ぐ。
nkf -gにはちゃんと文字列として渡す。
それどころかワンライナーまで出しやがった。マジで人間要らねぇ……
はい、
if
文を使用せずに、find
コマンドとxargs
コマンドを組み合わせて、以下のようなシェルスクリプトに書き換えることができます。
#!/bin/bash
find . -type f -name "*.csv" -print0 | xargs -0 nkf --guess | grep "Shift_JIS" | cut -d ":" -f1 | xargs -I{} nkf -w --overwrite "{}"
このスクリプトは、カレントディレクトリから再帰的にcsvファイルを検索し、
xargs
コマンドを使用してnkf
コマンドの--guess
オプションに渡します。その後、grep
コマンドを使用してShift_JISエンコーディングのファイルのみを抽出し、cut
コマンドを使用してファイル名のみを取り出します。最後に、再度xargs
コマンドを使用して、取り出したファイル名に対して、nkf
コマンドの-w
オプションと--overwrite
オプションを使用してutf-8に変換し、元のファイルを上書き保存します。
一括変換
findで拾ってパイプしてiconvかnkf。
xargsは標準入力を引数に変える。
一括iconv(文字コード変換) – Linux memo
Linux ファイルの文字コード確認・変換 - Qiita
ただ単純にxargsだと一つのコマンドでしか-iの引数を使えない。結局はbash -cで実行を挟むことになる。
iconvだと読み込みが自動じゃないので、うっかりutf-8をshift-jisで読んで惨事になりそう。if文で弾けば少しは楽。ただそれだとワンライナー難しい。三項演算子を使えばワンライナー簡単。
One Line if-else Condition in Linux Shell Scripting | Baeldung on Linux
nkfを使う場合は、自動で読めるので全部一気にutf-8にしてしまえばいい。
判別
Linux/UNIXでファイルの文字コード(UTF-8 or Shift_JIS or EUC-JP…)を確認する | 俺的備忘録 〜なんかいろいろ〜
iconv
その文字コードで無効な文字が含まれてる場合は-c
で無視できる。まあそれってつまり読む文字コード間違えてるってことだろうけど。
linux - Why iconv cannot convert from utf-8 to iso-8859-1 - Stack Overflow
xargs
標準入力を引数に変える。
-I
で任意の文字列に標準入力を代入。デフォルトは{}
。よく似た-i
は非推奨なので注意。
ちなみにパイプは標準出力を標準入力に変える。
find -exec と find | xargs との違い | だえうホームページ
パイプ | について解説( | と | xargs の違いも理解できる!) | だえうホームページ
https://atmarkit.itmedia.co.jp/ait/articles/1801/19/news014.html
find と xargs を組み合わせてコマンド実行 - いろいろ備忘録日記
bash
bashを実行する。
-cが何を意味するのかはピンとこなかった。find -execみたいなもんなんだろうけど。
shellの-cオプションについてUbuntuのsh(dash)、bash、zshはそれぞれ違う挙動をする - Qiita
find
andやor検索がある。
inameにすれば大文字小文字を区別しない。
findのAND検索・OR検索 論理演算子 NOT検索(特定のファイルを含まない) ex1-lab
findコマンドとは?Linuxコマンドでファイルやディレクトリを検索する方法をご紹介 | GMOクラウドアカデミー
nkf
ちゃんとconfig.hでコメントアウトを外してdefault localeを決めておかないとビルドできない。
また、chmodで権限を与えるのも忘れずに。
Site Unreachable
https://atmarkit.itmedia.co.jp/ait/spv/1609/29/news016.html
Termuxでnkfを使う - 資料室B3F
file
-iで文字コードが出る。
でも扱いにくそう。
Linuxコマンド【 file 】ファイルの種類を調べる - Linux入門 - Webkaru
which
コマンドが入ってるフォルダを教えてくれるっぽい?
makeしたコマンド置く場所を調べるのに。