Ich versuche, Dateien aus meinem Suchbefehl auszuschließen, .svg
aber .jpg
er 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- .svg
oder jede Nicht- .jpg
Datei. Was du geschrieben hast, lautet:
finden (alles, was kein SVG istoderalles was kein JPG ist)
Sie erhalten also die JPG-Dateien, da find
der 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, or
wird der zweite Teil nicht einmal berücksichtigt, wenn der erste Teil eines Ausdrucks als wahr ausgewertet wird.
Sobald find
Ihnen 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.