Linux の find コマンドから 2 つ以上のパターンを除外できないのはなぜですか?

Linux の find コマンドから 2 つ以上のパターンを除外できないのはなぜですか?

.svgfind コマンドからファイルを除外しようとしています.jpgが、両方とも返されます。何が間違っているのでしょうか?

find . \( ! -iname \*\.svg -o ! -iname \*\.jpg \)

答え1

あなたの論理には欠陥があります。現在使用しているコマンドでは、すべての非ファイル.svgまたはすべての非.jpgファイルが検索されます。あなたが書いた内容は次のようになります。

検索(SVG以外のものすべて)またはJPG以外のものすべて)

最初の部分は既に評価されており、SVG ファイル以外のすべてのものが返されているため、JPG ファイルが取得されますfind。オプションの解析方法により、式の最初の部分がortrue と評価された場合、2 番目の部分は考慮されません。

本質的には、findSVG 以外のすべてのものを返すので、JPG ファイルで何が必要かは考慮されません。


これを論理的に表現する正しい方法は次のようになりますand

find . \( ! -iname '*.svg' -a ! -iname '*.jpg' \)

これは次のようになります:

検索(SVG以外のものすべて)そしてJPG以外のものすべて)

または、式全体を否定すると次のようになります。

find . ! \(-iname '*.svg' -o -iname '*.jpg' \)

それは次のようになります:

それ以外のものをすべて検索する(SVGまたはJPG形式)

*単に一重引用符または二重引用符で囲むと、エスケープ処理を省略できることに注意してください(例 ) -iname '*.jpg'。これにより、読みやすくなります。

関連情報