it-swarm.com.de

Wie kombiniere ich 2-Namen-Bedingungen in find?

Ich möchte nach Dateien suchen, die nicht 2 -name Bedingungen entsprechen. Ich kann es so machen:

find /media/d/ -type f -size +50M ! -name "*deb" ! -name "*vmdk"

und dies wird zu einem korrekten Ergebnis führen, aber kann ich diese 2 Bedingungen mit OR irgendwie verbinden?

108
Patryk

Sie können dies auch mit einem negierten -regex Tun: -

 find ./ ! -regex  '.*\(deb\|vmdk\)$'
52
Alex Leach

ja, du kannst:

find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \)

Erklärung aus der POSIX-Spezifikation :

! Ausdruck: Negation eines Primärs; der unäre NOT-Operator.

( Ausdruck): Wahr, wenn Ausdruck wahr ist.

Ausdruck - o Ausdruck: Wechsel der Vorwahlen; der Operator OR. Der zweite Ausdruck wird nicht ausgewertet, wenn der erste Ausdruck wahr ist.

Beachten Sie, dass beim Öffnen und Schließen in Klammern ein Backslash (\) Vorangestellt wird, um eine Auswertung durch die Shell zu verhindern.

162
Serge

Sie waren einer Lösung nahe:

find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"

Sie können die folgenden Logikoperatoren in beliebiger Reihenfolge kombinieren:

-a   -and      - operator AND
-o   -or       - operator OR
!              - operator NOT
28
DenisKolodin

Sie können reguläre Ausdrücke wie folgt verwenden:

find /media/d -type f -size +50M ! -regex '\(.*deb\|.*vmdk\)'

Backslash ist der Escape-Charakter. . entspricht einem einzelnen Zeichen und * dient dazu, das vorherige Zeichen null oder mehrmals abzugleichen, also .* bedeutet, dass keine oder mehrere Zeichen übereinstimmen.

6
Francesco Turco