web-dev-qa-db-ja.com

パラメータの順序が `find`で見つかったファイルに影響するのはなぜですか?

この奇妙な振る舞いはfindで見つかりました。 findへのパラメータの順序に応じて、さまざまなファイルが検索されます。

たとえば、次の内容のディレクトリツリーがあります。

.
├── configure.ac
├── Makefile.am
└── src
    ├── hello.c
    └── Makefile.am

私が走ったら

find -name '*.cpp' -o -name '*.[chS]' -print0 | xargs -0 echo

それはリストします

./src/hello.c

そして私が走れば

find -name '*.[chS]' -o -name '*.cpp' -print0 | xargs -0 echo

何もリストされていません。変更したのはファイル名の順序だけであることに注意してください。

2番目のコマンドがファイルをリストしない理由を誰かが説明できますか?

2
Kotte

-print0アクションは2番目の-name "filter"(検索用語でテスト)にのみバインドされるため、2番目のフィルターが一致する場合にのみ何かを出力します。これは、検索式のデフォルトの演算子がandであり、or-o)よりも緊密にバインドされるためです。つまり、2番目の式は次のように評価されます。

find -name '*.[chS]' -o \( -name '*.cpp' -print0 \) | xargs -0 echo

フィルタをグループ化してみてください。

find \( -name '*.[chS]' -o -name '*.cpp' \) -print0 | xargs -0 echo

あなたがそれを好むなら、あなたはこれをすることもできます:

find -name '*.[chS]' -print0 -o -name '*.cpp' -print0 | xargs -0 echo
3
Mat