
でこの奇妙な動作を発見しました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引数でテストされている)にのみバインドされているため、-name
2番目のフィルタが一致した場合にのみ何かが印刷されます。これは、クエリ式の基本演算子があり、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