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?

Antworten:


46

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

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

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.


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

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.


1
Das Hinzufügen einer Erklärung würde Ihre Antwort verbessern.
NN

Du hast recht. Einige Erklärungen hinzugefügt.
Francesco Turco
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.