findで条件に合致するファイルを検索する

findはUNIXコマンドのひとつで,ユーザの指定する様々な条件に合致するファイルを特定のディレクトリから検索してくれます.とても便利なのですがしばしば使い方を忘れてしまうのでここでまとめておきます.

オプションの一覧を含む詳しい使い方はterminalで

man find

とすることで閲覧できます.

よく使う検索例をいくつか挙げてみます.

1. カレントディレクトリで拡張子がdatのファイルを探す

find . -type f -name *.dat -maxdepth 1

引数,オプションについては

  • .はカレントディレクトリ
  • -type f は検索対象をファイルに限定(ディレクトリやシンボリックリンクを除外)
  • -name *.dat は名前が.datに後方一致
  • -maxdepth 1 は検索するディレクトリの深さ(1はカレントディレクトリのみ,2はサブディレクトリ1つまで)

となっています.もし,拡張子に大文字と小文字が混在しているとき(.txtと.TXTとを両方同時に検索したいとき)はオプションの-nameを-inameにすることでcase insensitiveにすることができます.

引数を . ではなく / にすればシステム全体から検索できます.そのようなことをすると検索対象となるディレクトリにアクセス権がないものが混ざって

find / -name *.dat

find: /usr/sbin/authserver: Permission denied

などのエラーが大量に出力されがちです.このようなエラーだけを非表示にするには

2> /dev/null

を追加して

find / -name ‘*.dat’ 2> /dev/nul

とするとよいです.findでファイルシステム全体を検索すると大変な時間がかかってしまうので,代わりにlocateコマンドを使った方が効率的です.locateについてはいずれ別の機会に書きます.

2. カレントディレクトリでtestという文字列を含む拡張子がtxtのファイルを探す

find . -type f -name ‘*.txt’ -exec grep “test” ‘{}’ \; -print -maxdepth 1

  • -exec grep “test”  ‘{}’ \; によって,findで拡張子がtxtになっているファイルが見つかるたびに,そのファイルと検索文字列testを引数にしてgrepを実行します. ‘{}’の部分がfindで見つけたファイルに相当します.\;はその後に続くオプションとの区切りとして必要になります.
  • -print はfindの検索結果をterminalに出力するオプションで,通常の検索時には付けずともよいものですが,-execでgrepを併用するときは必要になります.これがないとgrepで検索して一致した文字列を含む行だけが表示されます.

-execを使わずに,findとxargsをパイプラインで接続して

find . -type f -name ‘*.txt’ -maxdepth 1 | xargs grep -H “test”

とすることでもほぼ同様の検索が可能です.xargsは標準出力を読み込んで,それを引数として続く別のコマンドに渡すコマンドです.上の例では,findの検索結果を引数としてgrepに渡しています.grepの-Hはファイル名を表示するオプションです.

上の-execを使った例では検索結果が1行ずつgrepに渡されますが,xargsを使った例では結果がまとめてgrepに渡されます.対象となるファイルの数が多い場合はxargsの方が効率的に思えますが,実は-execの終端を \; ではなく + とすればxargsの場合と同様になります.

 

コメントを残す

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

CAPTCHA