¿Por qué no puedo excluir 2 o más patrones del comando de búsqueda en Linux?

¿Por qué no puedo excluir 2 o más patrones del comando de búsqueda en Linux?

Estoy intentando excluir archivos .svgy .jpgde mi comando de búsqueda, sin embargo, todavía los devuelve. ¿Qué estoy haciendo mal?

find . \( ! -iname \*\.svg -o ! -iname \*\.jpg \)

Respuesta1

Su lógica es defectuosa: con el comando que tiene ahora, encontrará todos los archivos que no sean .svgo no sean .jpgarchivos. Lo que escribiste dice así:

buscar (todo lo que no sea un SVGotodo lo que no sea un JPG)

Entonces obtendrás los archivos JPG, porque findya evalué la primera parte y te di todo lo que no es un archivo SVG. Debido a la forma en que se analizan las opciones, si la primera parte de una orexpresión se evalúa como verdadera, la segunda parte ni siquiera se analiza.

En esencia, una vez que findte devuelve todo lo que no es SVG, no le importa lo que quieras con los archivos JPG.


La forma correcta de expresar esto sería con una lógica and:

find . \( ! -iname '*.svg' -a ! -iname '*.jpg' \)

Esto se lee como:

buscar (todo lo que no sea un SVGytodo lo que no sea un JPG)

O, negando toda la expresión:

find . ! \(-iname '*.svg' -o -iname '*.jpg' \)

Que se lee como:

encontrar todo lo que no lo es (un SVGoun JPG)

Tenga en cuenta que puede omitir el escape *si simplemente lo pone entre comillas simples o dobles, por ejemplo -iname '*.jpg'. Esto es mucho más fácil de leer.

información relacionada