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?

Réponses:


46

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

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

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.


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

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.


1
Ajouter une explication rendrait votre réponse meilleure.
NN

Vous avez raison. Ajout de quelques explications.
Francesco Turco
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.