Jump to content 日本-日本語

製品  >  ソフトウェア  >  HP-UX   >  Knowledge-on-Demand  >  UNIXの教科書 応用編

UNIXの教科書 応用編
〜はじめよう! WindowsとLinuxからのステップアップ〜

第2日目:ファイルの検索

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む
第2日目:ファイルの検索
応用編第2回となる今月は、findコマンドについて学びます。findはファイルやディレクトリを検索するコマンドで、さまざまな検索条件のオプションを付けることによって、複雑な検索をこなすことができます。単にファイルを検索するだけではなく、検索結果を他のコマンドに引数として渡す方法も覚えましょう。findと連携させることで、前回のgrepをはじめ、これまで学んできたコマンドをより便利に使えるようになります。
UNIXの教科書 応用編〜はじめよう! WindowsとLinuxからのステップアップ〜 2日目
findコマンドの基本的な使い方
findコマンドの活用
2008年9月
大津 真

UNIXの教科書:登場人物紹介 このリンクをクリックすると、新しいウィンドウが開きます

マリー先生
マリー先生:
ディレクトリの階層が深くなってくると、ファイルをどこに保存したかわからなくなってしまった……なんてことはよくあるわよね。今回は、そんな時に便利なファイルの検索コマンドである「find」について説明しましょう。その前に、前回のgrepコマンドと正規表現の説明に関してなにか質問ありますか?
四色君:
正規表現が便利だということは理解できたのですが、パターンの作り方がいまいちピンとこなくて……。
四色君
マリー先生
マリー先生:
そうね、正規表現はすごく奥深い世界だから慣れるまでが大変ね。でも正規表現はgrepだけでなく、PerlやRubyといったWebで活躍する言語にも必須だし、高機能なテキストエディタにも搭載されているから、基本的なパターンは覚えておくとなにかと便利よ。
タックス君:
僕は正規表現をいろいろ実験している最中です。質問なのですが、テキストファイルから、文字のある行だけを表示することはできますか?
タックス君
マリー先生
マリー先生:
それは、ちょっと難しいわね。「文字のある行だけを表示する」ということを「空行、スペースとタブだけの行以外の行を表示する」と言い換えて、コマンドを考えてみましょう。実は、スペースやタブといった表示するときに空白になる文字は「[:space:]」という名前付きクラスで表せるの。マッチしなかった行を表示するには「-v」オプションを指定すればいいから、全体としては次のようになるわね。

$ grep -v  "^[[:space:]]*$" sample.txt 【Enter】
HP-UX
find
grep

今日の時間割 findコマンドの基本的な使い方 findコマンドの活用 練習問題

1時間目:findコマンドの基本的な使い方

今回紹介する「find」コマンドは、UNIXの世界では定番の、ファイルやディレクトリの検索コマンドです。findコマンドには、単に検索条件に一致するファイルの一覧を表示するという使い方だけでなく、見つかったファイルに対して別のコマンドを実行するといった活用法があります。この時間では、まず基本的な使い方について説明しましょう。

名前で検索する

次にfindコマンドの基本的な書式を示します。

find [オプション] 検索を開始するディレクトリ 検索条件

findコマンドを実行すると、引数で指定したディレクトリを辿りながら、検索条件に一致するファイルを表示していきます。もっともよく使用する検索条件は、指定した名前に一致するファイルやディレクトリを検索するというものでしょう。この場合、次のような書式で検索条件を指定します。

-name 文字列

たとえば、Documentsディレクトリ以下で、名前が「sample」のファイルもしくはディレクトリを検索するのは次のようにします。findコマンドは、検索条件に一致するファイルがひとつ見つかってもそこで終了しません。指定したディレクトリ以下の階層のディレクトリすべてが検索対象となり、見つかったファイルがすべて表示されます。また、なにも指定しないと、通常のファイルだけでなくディレクトリも検索対象となります。

$ find Documents -name sample  【Enter】
Documents/2008/sample
Documents/sample

四色君:
試しにルート「/」を起点に検索するとエラーがいっぱい表示されるのですが……。
四色君
マリー先生
マリー先生:
コマンドを実行するユーザに対して検索が許可されていないディレクトリを検索しようとするとエラーが表示されるの。そのようなディレクトリを検索するにはスーパーユーザの権限が必要よ。

ワイルドカードを使用した検索

初級編で解説した、「*」と「?」といったシェルのワイルドカードを覚えているでしょうか。

* 0個以上の任意の文字列に一致する
? 1文字と一致する

これらのワイルドカードは、findコマンドの名前による検索にも使えます。たとえば、カレントディレクトリを起点に、拡張子が「.txt」のファイルを検索するにはどうすればよいでしょう?まず、カレントディレクトリはピリオド「.」で、拡張子が「.txt」のファイルは「*.txt」というパターンで表せます。このとき、パターンがシェルによって展開されないように、ダブルクォーテーション「"」で囲って「"*.txt"」とします。
したがって、次のように実行すればよいわけです。

$ find . -name "*.txt"  【Enter】
./docs/mail.txt
./Documents/2007/ok.txt
./Documents/2007/ng.txt
./Documents/2007/readme.txt
./Documents/2008/sep.txt
./Documents/2008/magic.txt
./Documents/sample.txt
./Pictures/sample.txt
./sample.txt

タックス君:
あれ、こちらでは「*.txt」をダブルクォーテーション「"」で囲まなくてもOKですけど?
タックス君
マリー先生
マリー先生:
ワイルドカードにマッチするファイルがないときはアスタリスク「*」がシェルによって展開されずに、findコマンドにそのまま渡るの。でも、カレントディレクトリにどんなファイルがあるかを気にしなくてすむから、ダブルクォーテーション「"」で囲む習慣を付けておいたほうがいいわよ。
四色君:
先月のgrepコマンドで習った、[abc]や「0-9」といった文字クラスは使えるのですか?
四色君
マリー先生
マリー先生:
使えるわ。たとえば、名前が数字で始まって拡張子が「.txt」のファイルを、カレントディレクトリを起点に検索するには次のようにすればいいの。

$ find . -name "[0-9]*.txt" 【Enter】
./Documents/2008/9th.txt
./2008-3-1.txt


いろいろなオプション

findコマンドには、検索条件を設定するためのさまざまなオプションが用意されています。表1に代表的なオプションをまとめておきます。

<表1:findの代表的な検索オプション>

検索オプション 説明
-atime n n日前にアクセスされたファイル。
nではちょうどn日、-nではn日より後、+nではn日より前になる。
-ctime n n日前にステータス情報が変更されたファイル。
nではちょうどn日、-nではn日より後、+nではn日より前になる。
-mtime n n日前に修正されたファイル。
nではちょうどn日、-nではn日より後、+nではn日より前になる。
-group <グループ名> 指定したグループに属するファイル。
-user <ユーザ名> 指定したオーナのファイル。
-newer <ファイルのパス> 指定したファイルより後に修正されたファイル。
-perm <パーミッション> 指定したパーミッションが設定されているファイル。
-size <サイズ> 指定したサイズのファイル。
サイズはブロック数(1ブロックは512バイト)。「+」を指定した場合にはそれ以上、「-」の場合にはそれ未満。
-type <タイプ> 指定したタイプのファイル。
「b」はブロック型スペシャルファイル、「c」はキャラクタ型スペシャルファイル、「d」はディレクトリ、「f」は通常のファイル、「l」はシンボリックリンク。

検索条件を複数指定した場合には、それらのすべてに一致するファイルが検索されます。たとえば「-type d」はディレクトリを指定します。したがって、カレントディレクトリ以下で名前が5文字のディレクトリを検索するには、「-name "?????"」オプションと「-type d」オプションの2つを指定します。

$ find . -name "?????" -type d 【Enter】
./.dt/types
./.dt/icons
./.dt/Trash

修正日時による検索

「-mtime n」は修正日時による検索です。数字の前に「+」を指定した場合にはそれより前、「-」を指定した場合にはそれより後になります。

-mtimeでの検索結果
図1:-mtimeでの検索結果

たとえば、Documentsディレクトリ以下で、5日前より後に修正されたファイルを検索するには次のようにします。

$ find Documents -mtime -5 -type f 【Enter】
Documents/2007/ok.txt
Documents/2007/ng.txt
Documents/2007/readme.txt
Documents/2008/sep.txt
Documents/2008/magic.txt
Documents/2008/sample.txt
Documents/2008/sample
Documents/2008/9th.txt
Documents/sample.txt
Documents/sample.bak

四色君:
逆に、検索条件に一致しないファイルを見つけることはできるのですか?
四色君
マリー先生
マリー先生:
検索条件の前に否定を表す「!」を指定すれば可能よ。たとえば、Documentsディレクトリ以下の拡張子が「.bak」以外のファイルを見つけるには、次のようにすればいいの。このとき「!」の前後にはスペースが必要なので気をつけてね。

$ find Documents ! -name "*.bak" -type f 【Enter】
Documents/2007/ok.txt
〜以下略〜

休憩時間:Telnet/SSHクライアント PuTTY

読者の方の中には、WindowsからHP-UXにリモートログインして操作を行っている方も少なくないでしょう。Windowsで利用できるフリーのTelnet/SSHクライアントとしてはUTF-8 TeraTerm Pro with TTSSH2が代表的ですが、それ以外にも、「PuTTY このリンクをクリックすると、HP社外へリンクします。」というターミナルソフトも人気です。PuTTYは、 Simon Tatham氏によって開発されているオープンソースの Telnet/SSH クライアントです。SSHのプロトコルはバージョン1とバージョン2の両方に対応しています。PuTTY日本語版は以下のサイトからダウンロードできます。

http://hp.vector.co.jp/authors/VA024651/PuTTYkj.html このリンクをクリックすると、HP社外へリンクします。

接続先の指定
図2:接続先の指定

HP-UXにリモートログイン
図3:HP-UXにリモートログイン

連載記事一覧 1  |  2 次のページへ

本ページの内容は執筆時の情報に基づいており、異なる場合があります。

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

HPEサポートセンター
製品の標準保証でご利用いただける無償のサービスです。

ショールーム

ショールーム 導入をご検討のお客様へ
業務アプリケーションの継続・標準化・開発性とシステム担当者様、システム開発者様が抱える悩み・疑問に対する解決策実体験して頂けます。
印刷用画面へ
プライバシー ご利用条件・免責事項