¿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?

Respuestas:


46

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

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

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.


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

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.


1
Agregar una explicación mejoraría su respuesta.
NN

Tienes razón. Se agregaron algunas explicaciones.
Francesco Turco
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.