ここでは、ファイルやディレクトリの検索について説明していきます。人間という生き物は、忘れる動物です。おっと…こんな堅苦しい説明はぬきにしましょう(^▽^;) どのOS
を使用するにしろ、ファイルを検索する機能は欠かせないものです。ここでは、主に、locate
コマンドと、find コマンドについて解説していきます。
|
|
■データベース内から検索 [ locate ]
まず、簡単な検索コマンドである、locate コマンドについて解説します。locate コマンドは、あらかじめ作成されているデータベースを参照して、ファイル及びディレクトリを検索するコマンドです。既にデータベースが作成されている中から検索をかけるため、後述する
find コマンドよりも高速に特定のファイルを見つけ出す事ができます。ただし、欠点もあります。それは、データベースが最新版でなければ、検索にひっかからないということです。なので、新規にファイルやディレクトリを作成したり、ソフトウェアをインストールした際には、いちいち
updatedb コマンドを使用して、データベースを最新の状態にしておく必要があります。また、その逆も考えられます。データベースが最新でないと、既に削除したファイルなのに、検索するとマッチしてしまいます。そこで、実際に見てみるとそのファイルは存在しなかったというパターンもよくある話です。もし、現在の状態からファイルを検索したいのなら、find
コマンドを使用する事になります。
なお、現在では、locate コマンドは、
slocate
コマンドへシンボリックリンクが貼られているため、実際には、slocate コマンドを実行していることになります。slocate
コマンドは、データベース内に所有者情報やパーミッションの情報も含まれるため、読み取り権限のないユーザーなどが
locate コマンドを実行しても検索にはひっかからないようになっています。これによって、よりセキュリティが向上してします。因みに、slocate
データベースは、/var/lib/slocate/slocate.db に格納されています。
# ls -la /usr/bin/locate
lrwxrwxrwx 1 root slocate 7 2月 3 04:33 /usr/bin/locate
-> slocate |
|
それでは、実際に解説に移ります。まず、updatedb コマンドを使用してデータベースを最新状態に更新します。なお、updatedb
コマンドを使用できるのはスーパーユーザーのみです。
updatedb をバックグラウンドで実行するには、& を付け加えます。
なお、updatedb コマンドは、cron によって1日に1回、シェルスクリプトによって定期的に実行されるようになっています。
# cat /etc/cron.daily/slocate.cron
#!/bin/sh
renice +19 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "nfs,smbfs,ncpfs,proc,devpts"
-e "/tmp,/var/tmp,/usr/tmp,/afs,/net" |
|
updatedb コマンドの処理が終えたら、ようやく、locate コマンドを使って検索できるようになります。なお、2度目にupdatedb
コマンドを使用する場合には、一度目より早く終了します。以下例は、httpd.conf にマッチするファイルが検索されます。
# locate httpd.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf.bak |
|
locate コマンドは、ワイルドカード「*」を使用する事もできます。
# locate *td.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf.bak
/etc/xinetd.conf |
|
■/etc/updatedb.conf
updatedb の設定ファイルは、/etc/updatedb.conf で設定します。updatedb
コマンドは、この設定ファイルがないと、CD-ROM内のファイルや、/tmp フォルダなどの一時的に作成されるファイルまでデータベースに含めてしまいます。しかし、CD-ROMなどのファイルまでデータベースに含めてしまうと、CD-ROMを取り除いたときには、存在しないファイルとして検索される事になってしまいます。この問題をさけるために、このupdatedb.conf
ファイルで updatedb の対象から除外するファイルシステム、もしくは、ディレクトリへのパスを記述しておきます。記述の仕方は単純で、変数を定義し、それを適用するために、export
コマンドを記述しておくだけです。もし、ここで指定されていないもので、updatadb コマンドの対象からはずしたいものがあれば、追記しておくとよいでしょう。
PRUNEFS="devpts
NFS nfs afs sfs proc smbfs autofs auto iso9660"
PRUNEPATHS="/tmp /usr/tmp /var/tmp
/afs /net /sfs"
export PRUNEFS
export PRUNEPATHS |
|
■ファイル/ディレクトリの詳細検索 [ find ]
find コマンドは、指定したディレクトリ以下のファイルやディレクトリを検索します。locate コマンドのようにデーターベースファイルは存在せず、コマンド実行時より検索しにいくため、ディスクアクセスが激しくなります。その代わり、locate
よりも詳細に目的のものを検索できるという利点があります。
以下例は、/etc ディレクトリ以下の conf というファイル名のファイルを検索しています。locate
コマンドと異なる点は、locate では、conf という文字列を含むファイルを全て列挙しましたが、find
コマンドの場合は、conf というファイル名をもつ完全一致のファイルが検索されます。もし、locate
コマンド風に検索するならば、
find /etc -name *conf* となります。
$ find /etc -name
conf
/etc/log.d/conf |
|
次に、-atimeオプションをつけて最終アクセス日を基にして検索してみます。以下は、カレントディレクトリ内で最終アクセス日7日以内のファイルを検索します。+7
にすると、7日以上経過したファイルを検索するようになります。
以下の例は、アクセス権が755のファイルのみ検索します。
|
-name <文字列> |
文字列を含むファイルを検索 |
|
-atime <日数> |
最終アクセス日で検索 |
|
-mtime <日数> |
最終更新日で検索 |
|
-perm <アクセス権> |
8進数のアクセス権表記で検索 |
|
-size <サイズ> |
ブロック単位のファイルサイズで検索 |
|
-type |
ファイルタイプで検索 |
|
-user <ユーザ名> |
ファイルの所有者で検索 |
|
-empty <ファイル名> |
空の(容量が0バイト)のファイルやディレクトリを検索する |
|
なお、アクションとして、
-exec <コマンド> {} \; を指定する事で、検索結果のファイルにコマンドを実行する事ができるようになります。以下例は、容量が0バイトのファイルやディレクトリを検索し、削除するという意味になります。
$ find . -empty -exec
rm {} \; |
|