![-print を明示的に追加すると find(1) の動作が異なるのはなぜですか?](https://rvso.com/image/1457450/-print%20%E3%82%92%E6%98%8E%E7%A4%BA%E7%9A%84%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%81%A8%20find(1)%20%E3%81%AE%E5%8B%95%E4%BD%9C%E3%81%8C%E7%95%B0%E3%81%AA%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
のマニュアルページには次のようにfind(1)
書かれています:
式に 以外のアクションが含まれていない場合
-prune
、
しかし、次の 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
とにかく、そう思います :)