findとlocate
古いログを片付けるつもりが、符号を逆に書いたせいで今日のログを消してしまう。find の事故はほとんどこれです。-mtime のプラスとマイナスは、言葉で説明できるところまで持っていかないと当たりません。
find は探す場所が先、条件が後
ターミナル
find <探し始める場所> <条件> <アクション>左から、どこから探すか、何を探すか、見つけたら何をするか、の順です。条件を書かなければ全部が該当し、アクションを書かなければ -print として扱われてパスが1行ずつ出ます。grep のようにパターンを先に書く形ではない、というのが他のコマンドとの違いです。
| 条件 | 意味 |
|---|---|
| -name "*.conf" | 名前が一致するもの。大文字と小文字を区別する |
| -iname "*.CONF" | 名前が一致するもの。大文字と小文字を区別しない |
| -type f | 通常のファイル |
| -type d | ディレクトリ |
| -type l | シンボリックリンク |
-name にワイルドカードを渡すときは必ず引用符で囲みます。囲まないとシェルが先に展開してしまい、find に届く前に別のものへ化けます。ほかに所有者で絞る -user と -group、権限で絞る -perm があります。-perm 644 はちょうど 644、-perm -644 は 644 のビットをすべて含むもの、-perm /222 はどれか1つでも持つものです。
大きさと日時は符号で意味が変わる
ターミナル
find /var -size +10M
find /var/log -mtime +7
find /var/log -mtime -7大きさの単位は c がバイト、k がキロバイト、M がメガバイト、G がギガバイトです。単位を省略すると b、つまり 512 バイトのブロックで数えられます。
日時の条件は -mtime が内容の変更、-atime が最後のアクセス、-ctime が inode の情報の変更、-mmin が分単位です。
符号の意味は大きさも日時も同じで、プラスがそれより大きい、マイナスがそれより小さい、符号なしがちょうどその値です。日時では経過日数に対する不等号として読みます。-mtime +7 は経過日数が大きい方、つまり7日より前に変更された古いファイル。-mtime -7 は経過日数が小さい方、つまり7日以内の新しいファイル。-mtime 0 は24時間以内です。
条件を並べて書くと暗黙の AND です。OR は -o を挟み、優先順位は括弧をバックスラッシュでエスケープして示します。否定は感嘆符か -not です。
ターミナル
find /etc \( -name "*.bak" -o -name "*.old" \)-exec のセミコロンとプラスは起動回数が違う
アクションは -print が既定で、-ls は詳細表示、-print0 はヌル文字区切り、-delete は削除です。-delete は確認なしで消えるので、まず -print で対象を確かめてから付け替えます。
ターミナル
find /var/log -name "*.log" -mtime +30 -exec ls -lh {} \;
find /var/log -name "*.log" -mtime +30 -exec ls -lh {} +{} は見つかったパスに置き換わる目印です。終わり方が2種類あり、ここが頻出です。セミコロンで終える形は1件につき1回コマンドを起動します。プラスで終える形は、できるだけ多くのパスをまとめて1回の起動に渡します。ファイルが1万個あれば前者は1万回、後者は数回で、速さが桁で変わります。セミコロンはシェルに食われるので、エスケープするか引用符で囲みます。
名前に空白が入るファイルまで安全に扱うには -print0 と xargs -0 を組み合わせます。これも、まず ls で対象を目視してから処理側のコマンドへ差し替えます。
locate は updatedb の写しを引く
locate はディスクを毎回たどるのではなく、updatedb があらかじめ作ったデータベースを引きます。速い代わりに、作成時点より後に生まれたファイルは見つかりません。さっき作ったファイルが出てこないのは故障ではなく鮮度の問題で、updatedb を実行すれば見つかります。設定は /etc/updatedb.conf にあり、検索対象から外すパスをここで指定します。
find は遅い代わりに常に最新、locate は速い代わりに情報が古いことがある。この対比がそのまま答えになります。なお、この学習環境には locate も updatedb も入っていません。
試験で狙われるところ
find は場所が先で条件が後です。-mtime +7 は古い方、-mtime -7 は新しい方です。-size の単位を省略すると 512 バイトブロックになります。-exec のセミコロンとプラスは起動回数が違います。