findでファイル検索入門

文:Vincent Danen(TechRepublic) 翻訳校正:原井彰弘
2007-12-26 06:00:00
  • このエントリーをはてなブックマークに追加
最新特集【一覧】

 意外と知られていないようだが、"find"はLinuxに含まれている珠玉のツールだ。findでは、名前やファイルサイズ、更新日など多数の条件でファイルを検索することができる。findを用いることで、今まで時間をかけて手作業で探さなければならなかったファイルを、簡単に検索できるようになるだろう。

 最も単純な使い方から説明しよう。findを用いてシステム内にあるすべてのファイルを表示するには、以下のように入力する。

$ find /

 このように入力すると、すべてのファイルの一覧が表示される。特定のファイル名で検索したい場合には、次のように行う。

$ find / -name passwd
/usr/bin/passwd
/usr/sbin/passwd
...

 また、passwdという名前で、かつパーミッションが0700のファイルを検索したい場合は、次のように入力すればよい。

$ find / -name passwd -perm 0700
/usr/sbin/passwd

 setuidでrootに設定されたファイルをすべて検索したい場合は、次のように入力する。

$ find /usr -perm 4755 -user root

 また、/tmpに含まれているファイルをすべて削除したいが、ディレクトリだけはそのまま保持したいという場合には、次のように入力すればよいだろう。

# find /tmp -type f -exec rm -f {} \;

 このコマンドでは、種類がf(通常ファイル)のファイルを探し、それぞれのファイル({}で示されている)に対してコマンドrm -fを実行している。-execに渡されるコマンドは、バックスラッシュとセミコロン(\;)で終えなければならないことに注意して欲しい。もし、ここで自分のファイルのみを検索して削除したければ、次のように入力する。

$ find /tmp -type f -user `whoami` -exec rm -f {} \;

 このように入力すれば、コマンドを実行しているユーザが所有するファイルのみが削除される。

 また、カレントディレクトリ以下を検索したければ、パスにピリオド(.)を使用すればよい。加えて、他のあるファイルよりも後に作成されたファイルを探したい場合、次のように入力する。

$ find . -cnewer somefile.txt

 このコマンドを実行すると、somefile.txtよりも後に作成されたファイルがすべて一覧で表示される。

 最後に、複雑な例をお見せしよう。カレントディレクトリ以下にある過去30日間に変更されたファイルで、かつ文字列.svnが含まれていないものを探し、さらにそれらのファイルをlsコマンドで一覧表示したい場合、次のようにすればよい。

$ find . -type f -ctime -30 -not -regex ‘.*svn.*' -exec ls {} -al \;

 ここでは、多くの値が指定されている。まず「種類がfのファイルすべて」、そして「30日以内に作成されたもの」、さらに「正規表現.*svn.*にマッチしないもの」。そして最後には、結果をlsコマンドにls [マッチしたファイル] -alとして渡しているのである。補足だが、このコマンドを読めば、マッチした文字列({})はコマンドの最後でなくても構わないということも分かるだろう。これ以外の記述方法としては、lsを呼び出さずに-printオプションを用いる方法がある。

$ find . -type f -ctime -40 -not -regex '.*svn.*' -print

 findコマンドには、さまざまな基準にマッチする特定のファイルを見つけ出すために、多数のオプションとテストが用意されている。findはとても強力なのである。

  • コメント(4件)
#1 大野晋一   2007-12-26 17:56:54
いまどき、「-exec」は使いませんよね……
find /tmp -type f | xargs rm -f
#2 ASL   2007-12-26 18:29:59
find /tmp -type f -delete が便利です。
#3 大野晋一   2007-12-26 18:39:58
それもあり。でも、-delete オプションって、一部のfindに入ってないのですよ…… 手元のFreeBSDとMac OS Xには入ってるみたいですが、Solarisには入ってませんでした。
#4 ASL   2007-12-26 22:24:18
了解です。-deleteは IEEE Std 1003.2 (POSIX.2)拡張なので、OSを選ぶようですね。
  • 新着記事
  • 特集
  • ブログ