-print を明示的に追加すると find(1) の動作が異なるのはなぜですか?

-print を明示的に追加すると find(1) の動作が異なるのはなぜですか?

のマニュアルページには次のようにfind(1)書かれています:

式に 以外のアクションが含まれていない場合-prune-print式が true となるすべてのファイルに対して が実行されます。

しかし、次の 2 つの表現には違いがあるようです。

$ find . -path '*fo*' -prune -o -type f -print
./bar/xzyzzy
$ find . -path '*fo*' -prune -o -type f
./foo
./bar/xzyzzy

./foo後者の出力になぜ含まれるのでしょうか?

上記のディレクトリ ツリー構造の例を次のように作成しました。

$ cd $(mktemp -d)
$ mkdir foo
$ mkdir bar
$ touch foo/quux
$ touch bar/xzyzzy

find --version私の場合の出力は次のようになります:

find (GNU findutils) 4.4.2`

答え1

ああ、自分で解決したと思うよ...

前者の場合-printのみ-path '*fo*'の短絡動作のため、最初の条件 ( ) が真でない場合-o

しかし、2番目のケースでは、暗黙-print全体-path '*fo*'式が真である - が真である場合に該当しますまたは -type fは真です。言い換えれば、私の質問の 2 つのコマンドは次のものと同等です。

$ find . \( -path '*fo*' -prune \) -o \( -type f -print \)
./bar/xzyzzy

... そして:

$ find . \( -path '*fo*' -prune -o -type f \) -print
./foo
./bar/xzyzzy

とにかく、そう思います :)

関連情報