私はGNUのを使用していますfind
。
私は問題を次のシェル セッションに簡略化しました。
$ mkdir t
$ cd t
$ touch a
$ ln -s a b
$ find -type l
./b
$ find -type l -o -type f
./a
./b
$ find -type l -print
./b
$ find -type l -o -type f -print
./a
非常に眠いからかもしれませんが、2 つのことが理解できません。
- 違いますか? を追加すると、一致しているにもかかわらず、一致しなくなるのはなぜ
true OR false == true
ですか?-o -type f
find
./b
-type l
- マニュアル ページには、これが
-print
デフォルトの表現であると書かれていますが、なぜ、これが言及されていないファイルは印刷され、言及されているファイルは省略されるのでしょうか。
これは(実際に必要なもの)を使用する場合にも発生します-printf
。他の表現も影響を受けると思います。
答え1
で
find -type l -o -type f -print
アクションを指定したので、デフォルトは適用されなくなりました。しかし-printf
、ここでは-type f
「and」が「or」よりも優先順位が高いため、これは次のものと同等であると考えることができます。
find \( -type l \) -o \( -type f -print \)
リンクとファイルの両方を同じように処理するには、テストをグループ化する必要があります。
find \( -type l -o -type f \) -print