Saba note

醜悪コード Ugly hacks ITものづくり

findとかgrepとかを使って再帰的検索など

findでファイル名を検索

findはファイル名を検索します。ほんとにごく頻繁に使う便利なコマンドです。ディレクトリとファイル名を指定して検索しますが、例によってfind / -name “*”こういうコマンドはナンセンスです。検索したいディレクトリに移動してその下位ディレクトリを再帰的に検索するのかベターかと思います。

$ find . -name "*.html"

ファイル数を数える

ファイル数を数えるコマンドとかあったかもわからないけど、面倒なので書きだして行数数える。diffとる時なんかはこうやって書き出して比べてみるといいです。余分なファイルとか足りないファイルがあったりなかったり。

$ find . -name "*.html" > htmllist.txt

ファイルを再帰的に削除

慎重にやってほしいものですが、先日べらぼうに重いのでPDFだけでも消したいと思って、以下のようなコマンドに。-fものなので厳重注意です。できれば使わない方が身のため。

$ find . -name "*.pdf" -exec rm -f {} \;

ファイル名をフルパスとかで出力

再帰的にすべてのファイル一覧とかつくるときは、type -fでOKです。

$ find /home/user/www -type f

ディレクトリ名を検索

単純にディレクトリ名のみを検索したいときはtypeで指定してあげます。-nameオプションで検索対象のディレクトリ名を指定する感じです。正規表現も使えるので、-name ‘*-css’みたいに2014-cssみたいなディレクトリ名も検索できます。

find . -name 'css' -type d

空のディレクトリ検索

無駄な空ディレクトリが結構あったりするので、そういうの検索します。これで検索可能なのですが、この検索結果で「空のディレクトリを削除する」際にはちょっと注意。これは、空のディレクリを含む上位のディレクトリも消してしまうので、数多くない場合は手で削除した方が無難ですね。

find . -type d -empty

grepで全文検索

カレントディレクトリ以下のすべてのファイルから指定のキーワードを検索するときはこれ。これは異常に使う。ないと死ぬ。

find ./ -name '*' | xargs grep 'オムニオラボ'

find同様に不毛な検索は体に毒なので、できるだけ対象ファイルを絞った方が早いし正確。アスタリスクですべてのファイルを検索するとjpgとかも検索対象になって、ファイル拡張子を指定する際には、

find ./ -name '*.html' | xargs grep 'オムニオラボ'

sedで全文置換

上記の全文検索と間違ってこのコマンド使うとおもしろことになるので注意してください。grepの全文置換は非常にいいですが、grep使わなくても再帰的に置換はできます。hogeをhugaに置換する場合は以下。

find . -type f | xargs sed -i 's/hoge/fuga/g'

面倒くさいのは/とか@とかあるとエスケープしないとダメというところです。sedは%hoge%huga%ということができて%を使った場合は/スラッシュとかエスケープしなくてもいいので便利なんですが、findと合わせ技にしたらエラーになりました。
もしかしたら、書き方が悪かったのかもしれないですが。
grep使ってファイルを指定する場合は、こんな感じでできました。ファイル拡張子指定する分だけ早いです。

find . -type f | grep -v '\.html$' | xargs sed -i 's/hoge/fuga/g'

更に詳しく一括置換コマンドとかのお話はこちら

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です