find コマンドの使い方とnkf を使って漢字コード一括変換をbashで行う例
特定のディレクトリ以下にある全ファイルの漢字コードを一括変換したいとき,Windowsでは KanjiTranslatorを,MacではMultiTextConverterを使用しています.
ですが,ごくたまにシェルでnkf使って一括変換したい場合もあるので,bashのforとfindを使った一つの方法についてメモしておきます(たまにしか使わないので忘れてしまう).
find の使い方あれこれ
- fooDirというディレクトリがあったとして,その中にあるすべてのファイルの一覧を表示する
$ find fooDir
この場合,ディレクトリも含めてすべてのファイルが表示されます.
- 特定パターンの名前を持つファイルを表示する.
$ find fooDir -name "*.exe"
この場合,".exe" で終わるファイル名を持つファイルだけが表示されます.
- 通常ファイルだけを表示する
$ find fooDir -type f
ディレクトリやシンボリックリンク,デバイスファイル等の特殊なファイルを除く,通常のファイルだけを表示します.
- 通常ファイルでは無いファイルだけを表示する
$ find fooDir -not -type f
パターンの否定を取りたい場合はパターン指定の前に -not をつければ良いみたいです.
- 通常ファイルかつ特定の名前を持たないファイルだけを表示する.
$ find fooDir -type f -and -not -name "*.exe"
こうすると,通常ファイルかつ,"*.exe"という名前を持たないファイルだけが表示されます.複数のパターンの論理積を取る場合は -and をつけると良いみたいです.同様に論理和の意味の -or もあります.
- マッチしたファイルに対して何かコマンドを実行したい.
$ find fooDir -type f -and -not -name "*.exe" -exec echo file={} \;
こうすると,通常ファイルかつ"*.exe"という名称でないファイルに対して,echoコマンドを実行して"file=<ファイル名>"のように表示します. {} はマッチしたファイル名に置き換えられるようです.またコマンドの区切りを示す "\;" が必要なようです.
bashを使っている場合,forを使ってマッチしたパターンに何か処理を行う方法もあります.
$ for i in `find fooDir -type f -and -not -name "*.exe"` > do > nkf --overwrite --oc=UTF-8 $i > done