Lista de archivos que no coinciden con un patrón?

Aquí se explica cómo se pueden enumerar todos los archivos que coinciden con un patrón en bash:

ls *.jar 

¿Cómo hacer una lista del complemento de un patrón? es decir, todos los archivos no coinciden * .jar?

 ls | grep -v '\.jar$' 

por ejemplo.

Use la coincidencia de patrones extendidos estilo egrep.

 ls !(*.jar) 

Esto está disponible comenzando con bash-2.02-alpha1. Primero debe ser habilitado con

 shopt -s extglob 

A partir de bash-4.1-alpha hay una opción de configuración para habilitar esto de forma predeterminada.

Regla de expansión de bash poco conocida:

 ls !(*.jar) 

POSIX define expresiones de corchetes que no coinciden, por lo que podemos permitir que el shell expanda los nombres de archivo para nosotros.

 ls *[!j][!a][!r] 

Esto tiene algunas peculiaridades, pero al menos es compatible con cualquier shell de Unix.

Con una versión apropiada de find , podrías hacer algo como esto, pero es un poco exagerado:

 find . -maxdepth 1 ! -name '*.jar' 

find encuentra archivos. El . argumento especifica que desea comenzar a buscar desde . , es decir, el directorio actual. -maxdepth 1 le dice que solo desea buscar un nivel profundo, es decir, el directorio actual. ! -name '*.jar' ! -name '*.jar' busca todos los archivos que no coinciden con la expresión regular *.jar .

Como dije, es un poco exagerado para esta aplicación, pero si elimina el -maxdepth 1 , entonces puede buscar recursivamente todos los archivos que no sean jar o lo que tenga fácilmente.

Una solución sería ls -1|grep -v '\.jar$'

Y si desea excluir más de una extensión de archivo, sepárelos con un conducto | , como ls test/!(*.jar|*.bar) . Vamos a intentarlo:

 $ mkdir test $ touch test/1.jar test/1.bar test/1.foo $ ls test/!(*.jar|*.bar) test/1.foo 

En cuanto a las otras respuestas, es posible que shopt -s extglob primero shopt -s extglob .

Si su ls soporta ( man ls ) use la --hide= . En tu caso:

 $> ls --hide=*.jar 

No es necesario analizar el resultado de ls (porque es muy malo) y se escala para no mostrar varios tipos de archivos. En algún momento necesité ver qué archivos generados que no son fuente, que no son objetos, que no son libtool estaban en un directorio (desordenado):

 $> ls src --hide=*.{lo,c,h,o} 

Trabajado como un encanto.