2013/07/11

linux find

-follow symbolリンクの先も検索する
-type f ファイルであれば、真
      d ディレクトリであれば、真
      l リンクであれば、真

-group owner
-user owner

-regex -name  [..] ファイル名正規表現に満たれば、真
-path  [..] path名は正規表現に満たれば、真

-atime (+/-)n +n日より大きい  -nn日より小さい
-mtime -mmin
-newer [file] 指定するファイルより新しい物

-perm +/- 755 パーミッションの権限比較

\(\) 中の物を優先する
! -not
-a and
-o or

-print
-fprint
-exec command '{}'\; ファイル名 ファイル数回実行され
-exec command '{}'+; ファイル名のグループ  一回実行され
find . -type f -print0 | xargs -0 コマンド  区切り文字を0にする そのコマンドは一回だけ実行



- find の -mtime +n のまとめ
find の -mtime +n の検索対象となるファイルは以下の通り。

mtime +0 今から24時間以上前のファイル
mtime +1 今から48時間以上前のファイル
mtime +2 今から72時間以上前のファイル

(n + 1) * 24 ってことだね。man にそう書いてあれば良かったのに。あとでスクリプトを書いて試してみよう。

試すパターン
find -mtime 日数
find -mtime +日数
find -mtime -日数

結果からいうと、
find -mtime -3 3日(72時間)前〜現在
find -mtime 3  3日(72時間)前〜4日(96時間)前
find -mtime +3 4日(96時間)前〜過去
こうなります。

find -maxdepth 1
・名前に日付を入れる
find /usr/local/backup/ -name `date +%Y%m%d -d '2day ago'` -exec rm -r {}\;

・find: `/usr/local/backup/20110115': No such file or directory
==>find が削除される前のディレクトリ配下もfindしようとしているから、findしようとした時にすでにディレクトリがなくなっているので、findできませんというエラーです
    find | xargs rm -r
    find -maxdepth 1
    2>/dev/null

・-exec command ;
    command を実行する。コマンドの戻り値が 0 ならば真。
    find のコマンドラインで指定されたこれ以降の引き数は、 `;' を含む引き数にいたるまで、すべてcommand の引き数とみなされる。
    文字列 `{}' は現在処理しているファイル名に置き換えられる。
    これは command 引き数のどこにあってもよく、単独で置かれていなくてもよい (単独で置かれていなければならないような find もある)。
    これらの文字はシェルによって展開されないよう、 `\' によってエスケープするか引用符で囲む必要がある。
    コマンドは find を実行したディレクトリから実行される。

・-exec {} \; と -exec {} + の違い
まず \; の 頭についてるバックスラッシュはこれがないとセミコロンがシェルのコントロール文字列だと判別されるためについてるだけです。
そして肝心の違いですが -exec {} \; は find で見つかったそれぞれのファイルを別々にコマンドに渡して、 -exec {} + は全部まとめて渡します
$ mkdir test
$ touch test/{a,b}
$ find test -exec echo foo {} \;
foo test
foo test/a
foo test/b
$ find test -exec echo foo {} +
foo test test/a test/b

-exec echo {}