Wie kombiniere ich 2-Namen-Bedingungen in find?

94

Ich möchte nach Dateien suchen, die nicht zwei -nameBedingungen entsprechen. Ich kann es so machen:

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

und dies wird ein korrektes Ergebnis liefern, aber kann ich diese 2 Bedingung irgendwie mit ODER verbinden?

Patryk
quelle

Antworten:

46

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

 find ./ ! -regex  '.*\(deb\|vmdk\)$'
Alex Leach
quelle
6
Beachten Sie, dass -regexweniger portabel als -name.
Jw013
145

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ären; der unäre NOT-Operator.

( Ausdruck ): Wahr, wenn Ausdruck wahr ist.

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

Beachten Sie, dass Klammern sowohl beim Öffnen als auch beim Schließen ein Backslash ( \) vorangestellt ist, um eine Auswertung durch die Shell zu verhindern.

Serge
quelle
2
Denken Sie daran, die gesamten Kriterien zu klammern, wenn Sie dies tun -execoder andere Maßnahmen in Bezug auf die findErgebnisse ergreifen. \( \)Andernfalls -execwird nur das zuletzt festgelegte -orKriterium berücksichtigt. Um an allen zu arbeiten, müssen Sie find \( <criterion> -o <criterion> \) -exec <command>
Folgendes beachten
25

Sie waren der Lösung nahe:

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

Sie können folgende Verknüpfungsoperatoren in beliebiger Reihenfolge kombinieren:

-a   -and      - operator AND
-o   -or       - operator OR
!              - operator NOT
DenisKolodin
quelle
6

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

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

Backslash ist das Escape-Zeichen. .Stimmt mit einem einzelnen Zeichen *überein und dient dazu, das vorherige Zeichen null oder mehrmals übereinzustimmen. Das .*bedeutet , dass null oder mehr Zeichen übereinstimmen.

Francesco Turco
quelle
1
Das Hinzufügen einer Erklärung würde Ihre Antwort verbessern.
NN
Du hast recht. Einige Erklärungen hinzugefügt.
Francesco Turco