find:-a演算子が-printと結合されたときに交換できないのはなぜですか?

find:-a演算子が-printと結合されたときに交換できないのはなぜですか?

現在のディレクトリにあるオーディオファイル(MP3など)と、現在のディレクトリまたはその下のどこかに存在するmp3以外のファイル(JPEGなど)にfindを使用するとします。
これに加えて、他のオーディオファイルを含むディレクトリもあります(私を除く例では、文字通りファイル検索から除外する必要があります。

find . \( -type d -name 'exclude_me' -prune \) -o \( -type f -a -iname '*.mp3' -a -print \)

-a(この例では必ずしも必要ではありませんが、明確にするために、いくつかの重複する括弧やその他の演算子を意図的に含めました。)

明示的なオプションの後-print(また参照http://mywiki.wooledge.org/UsingFind)、これは実際には「exclude_me」ディレクトリのすべての内容を省略し、現在のディレクトリから* .mp3ファイルのみを再帰的に一覧表示します。時には(常にそうではありませんが)、aliasコマンドは1行のコードで十分ですが、findコマンドにはパラメータが必要です。終わりライン。
-inameの '*.mp3'パラメータは次のとおりです。今後この-print場合、問題を解決する方法がないようですalias

しかし、単に2つのオプションを変えて数学のように振る舞うのはどうでしょうか?
このように:

find . \( -type d -name 'exclude_me' -prune \) -o \( -type f -a -print -a -iname '*.mp3' \)

.mp3ファイル内にmp3以外のファイル(画像など)が1つ以上ある必要があるという前提条件を設定しました。ディレクトリまたはそのサブディレクトリ。これに対するより明確な証拠を提供するために設立されました。いいえ後ろでは期待どおりに動作します。彼らがなければ、状況はこうなります。バラよりうまくいきます。持つ-iname '*.mp3'1行のコードにはさまざまな仕様がありますが、その仕様のためにmp3以外のファイルも一覧表示されます。それでは、-a演算子が数学のように動作しないのはなぜですか?ここで、「A+B」は「B+A」と同じである。またはfind専門用語として:

\( -type f -a -print -a -iname '*.mp3' \)

同じでなければなりません

\( -type f -a -iname '*.mp3' -a -print \)

それとも?

希望の結果を得る方法はありますか?そして-inameパラメータを行の途中ではなく行の末尾に配置しますか? (醜いハッキングソリューションgrep -v exclude_meなどは除く)

ベストアンサー1

andorC、C++、C♯、シェル、findなど、多くのプログラミング言語では互換性がありません。

彼らは左から右に怠惰な評価を使用します。つまり、左側の用語が最初に評価され、右側の用語が必要な場合にのみ評価されます。したがって、false and b答えbは常に間違っているため評価されません。ただし、2番目の項がfalseであることをまだ発見していないため、評価されますb and falseb

用語が純粋な関数(述部など)(ブール値を返し、他の操作を実行しない)の場合は違いはありませんが、操作を実行する場合(副作用がある場合)重要です。

-print何かしてみてください。印刷されるので重要です。

副作用(例:-print)を許可するすべてのシステムは評価順序を定義する必要があり、左から右に最も簡単になります。

おすすめ記事