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?
Vous pouvez aussi le faire en utilisant un -regex
Nié: -
find ./ ! -regex '.*\(deb\|vmdk\)$'
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.
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
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.