web-dev-qa-db-fra.com

Comment combiner des conditions à 2 noms dans la recherche?

Je souhaite rechercher des fichiers qui ne correspondent pas à 2 -name conditions. 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 OR en quelque sorte?

108
Patryk

Vous pouvez aussi le faire en utilisant un -regex Nié: -

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

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'un primaire; l'opérateur NOT unaire.

( expression): Vrai si l'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, à la fois d'ouverture et de fermeture, sont préfixées par une barre oblique inverse (\) pour empêcher l'évaluation par le shell.

162
Serge

Vous étiez proche d'une 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
28
DenisKolodin

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, donc .* signifie correspondre à zéro ou plusieurs caractères.

6
Francesco Turco