¿Cómo combinar condiciones de 2 nombres en find?

94

Me gustaría buscar archivos que no coincidan con 2 -namecondiciones. Puedo hacerlo así:

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

y esto producirá el resultado adecuado, pero ¿puedo unir estas 2 condiciones con OR de alguna manera?

Patryk
fuente

Respuestas:

46

También puede hacer esto usando un negado -regex: -

 find ./ ! -regex  '.*\(deb\|vmdk\)$'
Alex Leach
fuente
66
Tenga en cuenta que -regexes menos portátil que -name.
jw013
145

sí tu puedes:

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

Explicación de la especificación POSIX :

! expresión : negación de un primario; el operador unario NO.

( expresión ): verdadero si la expresión es verdadera.

expresión -o expresión : Alternancia de primarias; El operador OR. La segunda expresión no se evaluará si la primera expresión es verdadera.

Tenga en cuenta que los paréntesis, tanto de apertura como de cierre, están precedidos por una barra diagonal inversa ( \) para evitar la evaluación por parte del shell.

Sarga
fuente
2
Si está haciendo -execo cualquier otra acción en los findresultados, recuerde poner entre paréntesis \( \)los criterios completos, de lo contrario -execse aplicará solo al último -orcriterio editado. Para trabajar en todos ellos, find \( <criterion> -o <criterion> \) -exec <command>
escríbalos
25

Estuviste cerca de la solución:

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

Puede combinar los siguientes operadores lógicos en cualquier secuencia:

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

Puede usar expresiones regulares como en:

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

Backslash es el personaje de escape; .coincide con un solo carácter y *sirve para coincidir con el carácter anterior cero o más veces, lo que .*significa que coincide con cero o más caracteres.

Francesco Turco
fuente
1
Agregar una explicación mejoraría su respuesta.
NN
Tienes razón. Se agregaron algunas explicaciones.
Francesco Turco