読者です 読者をやめる 読者になる 読者になる

メモ書き

自分が後で見直すためにつけている作業のメモ書きです.それ以上の意味はありません

find コマンドの使い方とnkf を使って漢字コード一括変換をbashで行う例

シェル Debian

特定のディレクトリ以下にある全ファイルの漢字コードを一括変換したいとき,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

この場合だと,マッチしたファイルを nkfUTF-8 (BOMなし) に変換します.