reponの勉強メモ

主に勉強したことのメモです。

findコマンドの "-or" オプションはカッコで括る

複数の検索条件を -or オプションで繋げるとき、以下のように書きがち

$ find . -type f -name *.pdf -or -name *.txt -mtime -3

上記では、 カレントディレクトリの、ファイル名 .pdf か、ファイル名 .txt かつ 最後の修正日が3日前 と、「3日前」が後者の条件「*.txt」にしか掛からない。

-or オプションで列記したい条件はカッコで括る。

$ find . -type f \( -name *.pdf -or -name *.txt \) -mtime -3

これは

$ find . -type f -name *.pdf  -mtime -3 -or -name *.txt -mtime -3

と等価。

カッコにはバックスラッシュをつけること。

以下のようにエラーになる。

$ find . -type f ( -name *.pdf -or -name *.txt ) -mtime -3
-bash: 予期しないトークン `(' 周辺に構文エラーがあります

findコマンドの"-print0"アクションが、条件を複数にすると表示されないのはなぜ?

以下のようにfindコマンドで検索条件が一つの場合はnull文字を区切りとして正常に表示されるが、

$ find . -name "*.txt" -print0 | xargs -0 echo

以下のように検索条件が複数だと、これを実行しても表示されない。

$find . -name "*.txt" -or -name "*.html" -or "*.tmp" -print0 | xargs -0 echo

何が問題なのだろうか。

find(1)のmanページを見たが、いまいちピンとこなかったのです。