Warum kann ich in Linux nicht zwei oder mehr Muster vom Suchbefehl ausschließen?

Warum kann ich in Linux nicht zwei oder mehr Muster vom Suchbefehl ausschließen?

Ich versuche, Dateien aus meinem Suchbefehl auszuschließen, .svgaber .jpger gibt trotzdem beide zurück. Was mache ich falsch?

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

Antwort1

Deine Logik ist fehlerhaft: Mit dem Befehl, den du gerade hast, findest du jede Nicht- .svgoder jede Nicht- .jpgDatei. Was du geschrieben hast, lautet:

finden (alles, was kein SVG istoderalles was kein JPG ist)

Sie erhalten also die JPG-Dateien, da findder erste Teil bereits ausgewertet wurde und Ihnen alles gegeben hat, was keine SVG-Datei ist. Aufgrund der Art und Weise, wie die Optionen analysiert werden, orwird der zweite Teil nicht einmal berücksichtigt, wenn der erste Teil eines Ausdrucks als wahr ausgewertet wird.

Sobald findIhnen alles zurückgegeben wird, was kein SVG ist, ist es im Wesentlichen egal, was Sie mit den JPG-Dateien vorhaben.


Die korrekte Formulierung hierfür wäre ein logisches and:

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

Dieser lautet:

finden (alles, was kein SVG istUndalles was kein JPG ist)

Oder durch Negieren des gesamten Ausdrucks:

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

Der Text lautet:

finde alles, was nicht (ein SVGoderein JPG)

Beachten Sie, dass Sie das Escapen überspringen können, *wenn Sie es einfach in einfache oder doppelte Anführungszeichen setzen, z. B. -iname '*.jpg'. Dies ist viel einfacher zu lesen.

verwandte Informationen