2011-07-19 13 views
13

Cuando se utiliza el comando find en Linux, se puede agregar un indicador -regex que usa las expresiones regualr de emacs para que coincida.expresión regular para excluir tipos de archivo de find

Quiero buscar para buscar todos los archivos excepto .jar y .ear. ¿Cuál sería la expresión regular en este caso?

Gracias

Respuesta

28

No necesita una expresión regular aquí. Puede utilizar find con las opciones -name y -not:

find . -not -name "*.jar" -not -name "*.ear" 

A más concisa (pero menos legible) de la versión anterior es:

find . ! \(-name "*.jar" -o -name "*.ear" \) 
+1

+1, estaba a punto de sugerir esto, ya que es mucho más legible. – carlpett

+0

Estoy de acuerdo, Regex probablemente sería excesivo. –

+0

tiene razón, pero trato de hacerlo lo más genérico posible ya que lo estoy usando como una función y no sé cuáles serán las necesidades del usuario final – Michael

11

EDIT: Nuevo enfoque:

Desde expresiones regulares POSIX no son compatibles con lookaround, es necesario anular el resultado del partido:

find . -not -regex ".*\.[je]ar" 

La respuesta previamente publicado usa de búsqueda hacia atrás y por lo tanto no funcionará aquí, pero aquí es por completitud:

.*(?<!\.[je]ar)$ 
+0

Parece que no puede hacer que funcione en el comando. estoy usando 'find. -type 'f' -regextype posix-extended -regex '. * (? Michael

+0

Me parece que necesita colocar la opción' regextype' después de la opción 'regex'. Pero 'posix-extended' no suena bien; POSIX no tiene aspecto AFAIK. –

+0

¡Vaya! Parece que 'find' solo es compatible con motores POSIX BRE/ERE. En ese caso, esta solución no va a funcionar en absoluto. Perdón por eso (¿quién subió la fecha?) ... –

0

Usando una expresión regular en este caso suena como una exageración (solo podría verificar si el nombre termina con algo). No estoy seguro acerca de la sintaxis emacs, pero algo como esto debería ser lo suficientemente genérico para trabajar:

\.(?!((jar$)|(ear$))) 

es decir, encontrar un punto no seguido de final ($) "tarro" o (|) "oído (.) ".

+0

¿Y si el nombre de archivo no contiene un punto? O más de un punto? (Aparte del hecho de que la opción '-regex' coincide con el nombre completo, no solo con una parte) –

4
find . -regextype posix-extended -not -regex ".*\\.(jar|ear)" 

esto va a hacer el trabajo, y yo personalmente encontrar un poco más claro que algunas de las otras soluciones. Desafortunadamente, se requiere -regextype (abarrotar un comando por lo demás simple) para que el grupo de captura funcione.

Cuestiones relacionadas