この奇妙な振る舞いは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番目のコマンドがファイルをリストしない理由を誰かが説明できますか?
-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