Comment combiner des conditions à 2 noms dans find?

94

Je voudrais rechercher des fichiers qui ne correspondraient pas à 2 -nameconditions. Je peux le faire comme ça:

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

et cela donnera un résultat correct, mais puis-je joindre ces 2 conditions avec OU d'une manière ou d'une autre?

Patryk
la source

Réponses:

46

Vous pouvez le faire en utilisant une négation -regex, aussi: -

 find ./ ! -regex  '.*\(deb\|vmdk\)$'
Alex Leach
la source
6
Notez que -regexc'est moins portable que -name.
Jw013
145

Oui, vous pouvez:

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

Explication de la spécification POSIX :

! expression : négation d'une primaire; l'opérateur unaire NOT.

( expression ): True si expression est vraie.

expression -o expression : alternance de primaires; l'opérateur OR. La deuxième expression ne doit pas être évaluée si la première expression est vraie.

Notez que les parenthèses ouvrantes et fermantes sont précédées d'une barre oblique inverse ( \) pour empêcher l'évaluation par le shell.

Serge
la source
2
Si vous agissez -execou effectuez toute autre action sur les findrésultats, n'oubliez pas de mettre entre parenthèses \( \)l'ensemble des critères, sinon cela -execne s'appliquera qu'au dernier -orcritère. Pour travailler sur chacun d'entre eux, les parenthese:find \( <criterion> -o <criterion> \) -exec <command>
Victor Sergienko
25

Vous étiez proche de la solution:

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

Vous pouvez combiner les opérateurs logiques suivants dans n’importe quelle séquence:

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

Vous pouvez utiliser des expressions régulières comme dans:

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

La barre oblique inverse est le caractère d'échappement; .correspond à un seul caractère et *sert à faire correspondre le caractère précédent à zéro ou plusieurs fois, .*signifie donc correspondre à zéro ou plusieurs caractères.

Francesco Turco
la source
1
Ajouter une explication rendrait votre réponse meilleure.
NN
Vous avez raison. Ajout de quelques explications.
Francesco Turco