Linuxコマンドを勉強~find、locate、which、whereis、whatis~

find

findコマンドは、さまざまな条件でファイルを検索します。
たとえばファイル名や、何日前に更新したファイル、などです。

その書式は以下のとおり。

パスは、検索を開始するパスを指定したい場合に指定します。指定したディレクトリ以下を検索します。

コマンドは、-printオプションと-lsオプションぐらいでしょうか。
-printオプションを付けると、条件式で該当したファイル名を表示します。省略時は-printオプションを指定したことになります。
-lsオプションを付けると、条件式で該当したファイル名の詳細を表示します。「ls -lis」コマンドと同じ情報が表示されます。

条件式はたくさんあります。これも操作別に覚えた方がいいと思います。

操作 条件式 備考
ファイル名で検索 -name ファイル名 ファイル名にはワイルドカードが使えます。その場合は””などで囲みます。
正規表現で検索 -regex ファイル名 正規表現にファイル名の全体がマッチするファイルを検索します。一部の一致では検索されません。””などで囲みます。
グループ名で検索 -group グループ名
更新日時で検索 -mtime [+-]数字 数字のみ … 今日からn日前に更新されたファイル
+数字 … 今日からn日以上前に更新されたファイル(n日前を含む)
-数字 … n日前までに更新されたファイル(n日前は含まない)
アクセス日時で検索 -atime [+-]数字 数字のみ … 今日からn日前にアクセスされたファイル
+数字 … 今日からn日以上前にアクセスされたファイル(n日前を含む)
-数字 … n日前までにアクセスされたファイル(n日前は含まない)
サイズで検索 -size [+-]数値[ck] 数字c … nバイトのファイル
数字k … nキロバイトのファイル
+数字 … nバイトより大きいファイル(nバイトは含まない)
-数字 … nバイト以下のファイル(nバイトを含む)
ファイルタイプで検索 -type タイプ d … ディレクトリ
f … ファイル
l … シンボリックリンク
何階層までを検索 -maxdepth 数字 0 … 検索開始ディレクトリのみ
1 … 検索開始とそのサブディレクトリのみ
※数字が増えると検索対象の階層が増えます

例えば、

とすると、5日以上前に更新されたテキストファイルを検索します。
これを「-mtime 5」とすると、5日前、「-mtime -5」とすると、5日前より後に更新された、となります。

“-mtime”や”-atime”における+-の考え方、文章だと全然わからないと思います。
日付を数直線にすれば少し分かります。

昔、現場でバックアップとったDBダンプを定期的に削除するシェルを作ったとき、
○日前を含む含まないの説明がなかなか理解してもらえなかったのを思い出しました。

locate、updatedb

locateコマンドもファイルを検索するコマンドですが、検索する場所が違います。

linuxは、ファイル名やディレクトリ名一覧のデータベースを持っています。
locateコマンドはこのDBを検索するので、高速です。

findコマンドとは違い、-nameオプションは必要ありません。

しかしながら、locateコマンドはルート以下のディレクトリ名を含んだすべてのファイルのパスから検索することに注意です。
開始ディレクトリなどを正規表現で指定するなど工夫が必要です。

locateコマンドが参照するデータベースは、更新しないと新しく作成したファイルの情報が反映されません。

データベースの更新には、updatedbコマンドを使用します。
updatedbコマンドでは、「updatedb -eオプション ディレクトリ名」とすることで、
対象のディレクトリをデータベースから除外することができます。

つまり、そのディレクトリ以下のファイルはlocateコマンドで検索できないということになります。

また、/etc/updatedb.confを編集した後、updatedbコマンドを実行することでも同様に対象のディレクトリをデータベースから除外できます。

PRUNEFSはデータベースから除外するファイルシステム、PRUNEPATHSがデータベースから除外するディレクトリ名です。

which

whichコマンドは、PATH環境変数に定義されたディレクトリを調べ、該当のコマンドがどのディレクトリに置かれているか検索します。

PATH環境変数とは、使用したいプログラムやコマンドがこのディレクトリに置いてある、ということを定義する変数です。

whichコマンドは、その定義されているディレクトリの下を検索し、該当のコマンドのパスを表示します。

findコマンドが「/usr/bin/find」の下にあることが分かりました。

whereis

whereisコマンドは、コマンドが置かれているパス、マニュアルファイルが置かれているパスなどを検索できます。

“-b”オプションを指定すると、コマンドのパスだけを表示します。
“-m”オプションを指定すると、マニュアルファイルのパスだけを表示します。
“-s”オプションを指定すると、ソースファイルのパスだけを表示します。

whatis

whatisコマンドは、コマンドの簡単な説明を表示します。
マニュアルファイルのNAMEにある説明文ですね。

今までのところで、基本コマンドとファイル管理についてはほぼ勉強できたと思います。(ハードリンクとシンボリックリンクについての勉強が残っているのですが、それはファイルシステムを詳しく勉強した後ということで・・・)

これでまだ101試験の出題範囲の4分の1・・・ということなんです。
102試験も入れると8分の1・・・うーむ。先は長い。

ということで次からはプロセス管理について勉強します。

以下、追記です。

xargs

findコマンドとgrepコマンドを組み合わせると、便利なgrep機能が実現できます。
findで検索したファイルの中から、grepで文字列検索をするといった使い方です。

findコマンドの-execオプションを使用すると、findコマンドの結果をもって指定したコマンドを実行できます。{}の中に、その結果が入ります。

ただ、これだと検索されたファイルの数だけgrepコマンドが実行されることになり、処理に時間が掛かります。

そんなときは、xargsコマンドを使います。
xargsコマンドは、標準入力から受け取った文字列を次のコマンドの引数にしてくれるコマンドです。
grepのコマンドは次にようになります。

こうすることで、grepの実行は1回で済みます。

しかしながら、カレントディレクトリにスペースの入ったファイル名があったとすると、
このコマンドではそのスペースの入ったファイルを検索してくれません。

grepコマンドでは、ファイル1 ファイル2 ・・・と、複数ファイルをスペース区切りで判断するからです。

その場合は、findコマンドの”-print0″オプションを使用します。
“-print0″オプションは、findコマンドの結果を”\0″という文字を区切り文字として連結します。”\0″はNULL文字といい、0バイトの文字列のことです。

ただこれだけではダメで、
xargsコマンドには”-0″というオプションがあり、このオプションを指定すると、標準入力のNULL文字を引数の区切り文字であると認識するようになります。

こうすることで、スペースのあるファイル名も含めたファイルgrep機能を実現できます。
コマンドは下記のようになります。

以上です。

広告
  • LINEで送る