Jump to content 日本-日本語

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

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

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

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む
第2日目:ファイルの検索
UNIXの教科書 応用編〜はじめよう! WindowsとLinuxからのステップアップ〜 2日目
findコマンドの基本的な使い方
findコマンドの活用

2時間目:findコマンドの活用

1時間目の説明でfindコマンドの基本的な使い方が理解できたと思います。2時間目では、findコマンドを使いこなすためのテクニックをいくつか紹介していきましょう。

いずれかの条件に一致するファイルを検索する

前述のように、findコマンドに検索条件を複数記述するとすべての条件に一致するファイルが検索されます。そのような検索をAND検索などと呼びます。そうではなく、いずれかの条件に一致するファイルを検索するという、いわゆるOR検索を行う場合には、検索条件の間に「-o」オプションを記述します。たとえば、カレントディレクトリ以下で拡張子が「.txt」、もしくは「.html」のファイルを検索するには次のようにします。

$ find . -name "*.txt" -o -name "*.html" 【Enter】
./docs/mail.txt
./docs/abc.html
./Documents/2007/ok.txt
./Documents/2007/ng.txt
./Documents/2007/readme.txt
〜以下略〜


四色君:
それじゃ、もっと検索条件を複雑にして、拡張子が「.txt」もしくは「.html」で、かつ3日以内に更新されたファイルを見つけるといったことはできるのですか?
四色君
マリー先生
マリー先生:
算数の演算と同じように、( )で優先する条件を囲むことで可能よ。ただし、「()と「」」はシェルにとって特殊文字なので、その前には「\」を付けて通常の文字として扱う必要があるの。このように特殊文字の働きを失わせることを、“エスケープする”というので覚えておいてね。

$ find . \( -name "*.txt" -o -name "*.html" \) -mtime -3 【Enter】
./docs/abc.html
〜以下略〜

検索結果を他のコマンドで処理する

これまでの例では、findコマンドを実行すると検索されたファイルの一覧が画面に表示されましたが、これは検索結果を標準出力に表示する「-print」というオプションが省略されていたためです。
つまり、次の2つのコマンドは同じです。

$ find . -name "*.html" 
$ find . -name "*.html" -print

コマンドを画面に表示する代わりに、別のコマンドに引数として渡すこともできます。それには、「-print」オプションの代わりに「-exec」オプションを次の書式で指定します。

-exec コマンド {} \;

想像が付くかと思いますが、「{}」が検索されたファイルのリストに置き換わるわけです。最後の「;」はコマンドの終わりを示しますが、シェルの特殊文字のため、その前に「\」を記述してエスケープしています。このとき、コマンドの直後、および「\」の前にはスペースが必要です。また「{}」の内部にはスペースを入れてはいけません。


たとえば、カレントディレクトリ以下の拡張子が「.html」のファイルを、「ls -l」コマンドで表示するには次のようにします。

$ find . -name "*.html" -exec ls -l {} \; 【Enter】
-rw-r-----   1 o2         users         6677 Aug 24 23:20 ./docs/abc.html
-rw-r-----   1 o2         users         6677 Aug 24 23:19 ./abc.html
-rw-r-----   1 o2         users         6677 Aug 24 22:54 ./Site/index.html

タックス君:
「-exec」オプションを使わないで、単順に、findコマンドの結果をパイプ「|」で「ls -l」コマンドに渡せばいいんじゃないですか?
タックス君
マリー先生
マリー先生:
それはだめなの。なぜならlsコマンドは標準入力からデータを受け取るタイプのコマンドではないからよ。実際に実行してみるとわかるけど、findコマンドの結果は破棄されて、単にカレントディレクトリの一覧が表示されるわ。

$ find . -name "*.html" | ls -l 【Enter】
total 80
-rw-r-----   1 o2       users         25 Aug 24 23:11 2008-3-1.txt
drwxr-x---   2 o2       users         96 Aug 24 23:01 3sum
drwxr-x---   5 o2       users       8192 Aug 24 23:14 Documents
drwxr-x---   5 o2       users       8192 Aug 24 22:54 Pictures
drwxr-x---   2 o2       users         96 Aug 24 22:51 Sample

マリー先生
マリー先生:
findコマンドと前回紹介した文字列を検索するgrepコマンドを組み合わせたちょっとしたテクニックを紹介しましょう。カレントディレクトリ以下の拡張子が「.html」ファイルを検索して、文字列「HP-UX」含む行を表示するにはどうしたらよいかわかる?
タックス君:
「-exec grep "HP-UX" {} \;"」を使って、次のようにすればできますね。

$ find . -name "*.html" -exec grep "HP-UX" {} \; 【Enter】
<h1>HP-UX</h1>
<h2>HP-UX Chapter1</h2>
<h1>HP-UX SUPPORT</h1>
<h2>HP-UX 11i Version3:Feb</h2>
タックス君

マリー先生
マリー先生:
そうね。ただ、それだとファイル名はわからないわよね。先月も説明したけど、grepコマンドは引数にファイルを複数指定すると、最初にファイルのパスを表示してくれるの。

$ grep 44 mail.txt mail2.txt 【Enter】
mail.txt:oyamada hana,oyama33@example.jp,44
mail2.txt:sakurai taro,ss10@example.com,44
mail2.txt:nakata saburo,nsabu1@example.com,44

だから、なんらかのダミーのファイルを引数に加えればファイル名が表示されるわけ。指定するファイルは検索条件にひっかからないものなら何でもいいけど、よく使われるのは中身が空の/dev/nullという特別なファイルよ。

$ find . -name "*.html" -exec grep "HP-UX" {} /dev/null \; 【Enter】
./abc.html:<h1>HP-UX</h1>
./Site/index.html:<h2>HP-UX  Chapter1</h2>
./Site/samples/info.html:<h1>HP-UX  SUPPORT</h1>
./Site/samples/info.html:<h2>HP-UX 11i  Version3:Feb</h2>

ちなみに、/dev/nullは読み出したときは空のファイルだけど、データを書き込んでも空のままなの。

↓/dev/nullにファイルをコピーしても
$ cp /etc/hosts /dev/null 【Enter】
$ cat /dev/null 【Enter】
	←なにも表示されない


なんでも飲み込んでしまう、いわばブラックホールのような存在なわけ。不要なデータを画面に表示したくない場合にも便利だから覚えておいてね。

確認しながらコマンドを実行する

「-exec」オプションの代わりに、「-ok」オプションを使うと、検索されたそれぞれのファイルに対して、確認しながら指定コマンドを実行します。書式は「-exec」オプションと同じく次のような形式です。

-ok コマンド {} \;

たとえば、カレントディレクトリ以下でファイル名の最後がチルダ「~」のファイルを、ひとつずつ確認しながら削除するには次ようにします。

$ find . -name "*~" -type f -ok rm {} \; 【Enter】
< rm …… ./Documents/2008/info.txt~ >?   y   ←削除する
< rm …… ./Documents/sample.txt~ >?    n   ←削除しない
〜以下略〜

四色君:
「some.txt~」や「readme~」のようにファイル名の最後がチルダ「~」のファイルを時々見かけるのですが、なにか意味があるのですか?
四色君
マリー先生
マリー先生:
UNIX系のOSでは、最後がチルダ「~」のファイル名は、バックアップファイルの名前としてしばしば使われるの。


練習問題

第1問:Documentsディレクトリ以下で、拡張子が「.txt」のファイルを検索するコマンドはどれか?

a) find -name "*.txt" -type f
b) find Documents -name "*.txt" -type f
c) find Documents -name *.txt
d) find -name "*.txt" -type f Documents
正解はこちら
b)
拡張子が「.txt」のファイルは「-name "*.txt"」で指定できる。このときシェルによってワイルドカードが展開されないようにダブルクォーテーション「"」で囲む必要がある点に注意してほしい。

第2問:カレントディレクトリ以下で、名前の先頭が数字で始まり、4文字のディレクトリを検索するコマンドはどれか?

a) find . -name "[0-9]*"
b) find . -name ":number:" -type d
c) find . -name "[0-9]???" -type f
d) find . -name "[0-9]???" -type d
正解はこちら
d)
数字は「[0-9]」で、任意の1文字は「?」で表記できる。したがって、名前の先頭が数字で始まり、4文字のディレクトリを検索するオプションは「-name "[0-9]???" -type d」となる。

第3問:Picturesディレクトリ以下で拡張子が「.png」もしくは「.jpg」ファイルの数を表示するコマンドはどれか?

a) find Pictures/ -name "*.png" -o -name "*.jpg" | wc -l
b) find Pictures/ -name "*.png" -o -name "*.jpg" -exec wc -l {} \;
c) find Pictures/ -name "*.png" -exec wc -l {} \;
d) find Pictures/ -name "*.png" -name "*.jpg" -exec wc -l {} \;
正解はこちら
a)
検索結果を「wc -l」コマンドでカウントするには、findの結果をパイプ「|」で「wc -l」に渡す。

第4問:Documentsディレクトリ以下の拡張子が「.txt」のファイルを、確認しながらBackupディレクトリの下にコピーするコマンドはどれか?

a) find Documents/ -name "*.txt" -type f -exec cp {} Backup \;
b) find Documents/ -name "*.txt" -type d -ok cp {} Backup \;
c) find Documents/ -name "*.txt" -type f -ng cp {} Backup \;
d) find Documents/ -name "*.txt" -type f -ok cp {} Backup \;
正解はこちら
d)
検索結果に対して、その都度確認しながら指定したコマンドを実行するには「-ok コマンド {} \:」オプションを指定する。

連載記事一覧 戻る 1  |  2

教科書シリーズ 「UNIXの教科書」 「HAクラスターの教科書」 連載記事一覧

UNIXの教科書「基礎編」

第1日目:ログインしてコマンドを実行してみる
第2日目:ディレクトリやファイルを操作してみる
第3日目:シェルの基本を知る
第4日目:ファイルの基本操作
第5日目:viエディタの操作(基本編)
第6日目:リダイレクションとパイプを活用する
期末試験

UNIXの教科書「応用編」

第1日目:grepコマンドと正規表現
第2日目:ファイルの検索
第3日目:viエディタの操作(活用編)
第4日目:ファイルの圧縮とアーカイブ
第5日目:ジョブとプロセスの操作
第6日目:シェルの環境設定
第7日目:シェルスクリプトでより便利に
期末試験

UNIXの教科書「運用編」

第1日目:ユーザーの管理
第2日目:ファイルの安全管理(その1)
第3日目:ファイルの安全管理(その2)
第4日目:ネットワークの基本を理解する
第5日目:ネットワーク関連のコマンド
第6日目:システム情報の表示
期末試験 New!

HAクラスターの教科書

第1日目:ハードウェア構成を知る
第2日目:ネットワークを設定する
第3日目:共有ディスクを構成する
第4日目:HAクラスターを構成する
第5日目:パッケージを構成する
第6日目:障害テストを実施する
期末試験

 その他の連載記事


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

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

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

ショールーム

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