2007年12月4日火曜日

ファイル検索 find / grep / locate

#今回、「備考」が本題です。

例えば、「/etc/rc.d/init.d/syslog」、「/etc/syslog.conf」、「/etc/rc.d/rc5.d/S12syslog」等、ファイル名に「syslog」という文字が含まれているものを検索結果として表示したい場合、次のコマンドを実行する。ワイルドカードを使用する場合、シングルクォーテーション(')やダブルクォーテーション(”)で囲む必要がある。(用途に応じて)
# find /* -name "*syslog*"


上記ファイル名の他に「syslog」という文字が含まれているディレクトリも検索結果として表示したい場合は次のとおり。(例:「/home/syslog/test.txt」等)
# find /*|grep syslog


なお、上記と同様の実行結果を以下の方法でも得られる。しかも早い。
# locate syslog

ただし、locate コマンドで最新の検索結果を得たい場合は、事前に updatedb コマンドでデータベースを更新しておく必要がある。

また、ファイル名の最後が「*syslog」というファイル名だけに絞りたい場合、以下のように正規表現を利用する。
(シングルクォーテーション(引用符)をつけているのは、癖をつけるため。)
# find /*|grep 'syslog$'



■■■備考■■■
上記メモを残すために、locate コマンドと find がどれほど早さに違いがあるものか、実際に time コマンドを使って計測してみたところ、色々と分かった。

# time find /* -name "*syslog*"
real 0m31.601s
user 0m0.193s
sys 0m8.431s


# time locate syslog
real 0m0.615s
user 0m0.045s
sys 0m0.125s


real がコマンドを呼び出してから終了した時間なので、約31秒も違うことが分かる。

と、ここまでは良かったが、困ったのが出力結果をファイルにリダイレクトしようとした時。

# time locate syslog>time.txt

出力されない...

# time locate syslog 2>time.txt

しゅつりょくされない...

man time を見ると -o オプションでoutput FILE なるほど、なるほど。

では、
# time -o time.txt locate syslog

しゅつりょくされない....。

調べたところ、time は bash に組み込まれたコマンドとのこと。確かに type コマンドで確認すると「time is a shell keyword」と出力される。which で /usr/bin/time と出たくせに。結局 time でリダイレクトをするには、以下の二通りで出来る。ただし、前者は標準エラー出力で出力されるので、その指定を行う。後者はbash の time ではないので、出力フォーマットが異なる。

# (time locate syslog)2>time.txt


# /usr/bin/time -o time.txt locate syslog

0 件のコメント: