公共用水域水質測定データ処理で必要になり,bashでファイルエンコードをsjis CRLFからutf-8 LFに一括変換するスクリプトを作りました.年号でディレクトリが分けられ,各ディレクトリには複数のsjis CRLF のcsvファイルが存在しているとき,これらをutf-8 LFに一括変換することを想定しています.元のファイルのエンコードはこれ以外でも大丈夫だと思います.

### 以下のディレクトリ構造を仮定 ###
./src/
./1971/*.csv
./1972/*.csv
...
./2016/*.csv

このとき,年号が連続していることを前提とすると,1971年から2016年までのファイルのエンコードを以下のスクリプトto_utf8.shで一括変換できます.

### ./src/to_utf8.sh の中身 ###
for year in {1971..2016}; do
  pushd ../${year}/
  find . -name "*.csv" -print0 | xargs -0 nkf -w --overwrite
  find . -name "*.csv" -print0 | xargs -0 nkf -d --overwrite
  popd
done

このスクリプトの実行はshではなく,. で行います.subシェルの問題です.

$ cd ./src  ### scriptの存在するディレクトリへ移動
$ . to_utf8.sh  ### sh to_utf8.sh では動かない