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

パラメータの順序が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番目のコマンドがファイルを一覧表示しない理由を説明できる人はいますか?

ベストアンサー1

ジョブ-print0は2番目の「フィルタ」(find引数でテストされている)にのみバインドされているため、-name2番目のフィルタが一致した場合にのみ何かが印刷されます。これは、クエリ式の基本演算子があり、and()よりも密接にバインドされているためです。つまり、2 番目の式は次のように評価されます。or-o

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

おすすめ記事