Linuxのファイル検索

findLPIC

Linuxにはいくつかの検索コマンドがあります。
ここでは、検索コマンドの中でもよく使われている find、which、type、localeコマンドを解説します。

findコマンドでのファイル検索

指定したディレクトリ配下で、条件にマッチするファイルとディレクトリを検索してリスト表示します。
ディレクトリ指定しない場合はカレントディレクトリ配下が検索対象になります。

検索条件にはファイル名以外にも、ファイルサイズや更新日時を指定して絞り込むことができます。
ただしアクセス権のないディレクトリ配下を検索することはできません。

例えば homeディレクトリ配下でファイル名末尾が「.txt」のファイルを検索する場合は下記のようにします。

find /home -name "*.txt"

検索式にメタキャラクタを使う場合はダブルクォーテーションで囲むようにします。

-name ファイル名ファイル名で検索
-type 種類種類で検索
f=ファイル、d=ディレクトリ、l=シンボリックリンク
-size サイズファイルサイズで検索
-mtime 日時最終更新日で検索
-atime 日時最終アクセス日で検索
-perm アクセス権アクセス権で検索
-user ユーザ名ファイル所有者で検索
-exec コマンド {} \;マッチしたファイルを引数にしてコマンド実行
-ok コマンド {} \;マッチしたファイルを引数にして確認しながらコマンド実行
findコマンドのオプション
# home配下で過去3日以内に更新されたファイルを検索
find /home -mtime -3 -type f
# home配下で60日以上アクセスされていないファイルを検索して削除
find /home -atime +60 -exec rm {} \;

whichでコマンドのパスを探す

コマンドのディレクトリ位置(パス)を探すにはwhichコマンドが便利です。

which コマンド名

環境変数PATHに書かれているディレクトリ配下からのみ検索します。
いわゆる「パスが通っているコマンド」が対象です。
一般ユーザで管理者コマンドは検索できません。

whereisコマンドとの違いは?

whichに似ているコマンドにwhereisコマンドがあります。
こちらはコマンドのバイナリファイル以外に、コマンドのソースコードやマニュアルも併せて検索することができます。

whereis [オプション] コマンド名
-bバイナリファイルを検索
-sソースファイルを検索
-mマニュアルファイルを検索
whereisコマンドのオプション

typeコマンドでコマンドの種類を知る

コマンドが普通の実行ファイルなのか、シェルの組み込みコマンドなのか、エイリアスなのか、シェルの予約後なのかを判別して表示します。

$ type rm
rm is /bin/rm  #rmは実行ファイル

$ type echo
echo is a shell builtin  #echoはシェル組み込み関数

$ type ls
ls is aliased to `ls --color=auto'  #lsはエイリアス

$ type if
if is a shell keyword  #ifはシェルの予約後

locateコマンドで高速に検索

locateコマンドを使うとfindよりも高速に検索できます。
下記は末尾が「.txt」のファイルを検索します。

locate "*.txt"

ただし、locateで検索する為には、あらかじめデータベースを作成しておく必要があります。

updatedbでファイル名データベースを作成・更新

locateコマンドが参照するためのデータベースはupdatedbコマンドで作ることができます。

updatedb [オプション]
-e パス除外するパスを指定
updatedbコマンドのオプション

下記の例は /tmp ディレクトリを除外してデータベース作成・更新します。

updatedb -e /tmp

CentOSやUbuntuなどのディストリビューションでは、updatedbコマンドはcronで定期的に実行されるようになっています。

updatedbコマンドに関する設定ファイルは /etc/updatedb.conf にあるので、必要に応じて編集して動作を変えることができます。

$cat /etc/updatedb.conf

PRUNE_BIND_MOUNTS="yes"

# データベースから除外するファイル名(拡張子)
# PRUNENAMES=".git .bzr .hg .svn"

# データベースから除外するディレクトリ
PRUNEPATHS="/tmp /var/spool /media /home/.ecryptfs /var/lib/schroot"

# データベースから除外するファイルシステム
PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devp
ts ftpfs devfs mfs shfs sysfs cifs lustre tmpfs usbfs udf fuse.glusterfs fuse.sshfs curlft
pfs ecryptfs fusesmb devtmpfs"

コメント