`find -type l` はファイルと一致しますが、`-type l -o -type f` は一致しません。ただし、明示的な `-print` がある場合のみです

`find -type l` はファイルと一致しますが、`-type l -o -type f` は一致しません。ただし、明示的な `-print` がある場合のみです

私は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 ffind./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

関連情報