Estoy intentando excluir archivos .svg
y .jpg
de 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 .svg
o no sean .jpg
archivos. 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 find
ya 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 or
expresión se evalúa como verdadera, la segunda parte ni siquiera se analiza.
En esencia, una vez que find
te 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.