2009-09-19 10 views
100

Solo quiero obtener los archivos del directorio actual y solo generar archivos .mp4 .mp3 .exe nada más. así que pensé que sólo pudiera hacer esto:Lista de archivos con ciertas extensiones con ls y grep

ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$ 

Pero no, como el primer grep es la salida sólo de mp4 para ello los otros 2 de grep no se utiliza.

¿Alguna idea? PD, Ejecutando este script en Slow Leopard.

+0

Esto realmente es un enfoque equivocado - en lugar de utilizar grep, utilice 'nullglob' shopt -s y luego sólo se refiere a' * .exe * .mp3 * .mp4'. Ver http://mywiki.wooledge.org/ParsingLs –

Respuesta

237

Por qué no:

ls *.{mp3,exe,mp4} 

no estoy seguro donde aprendí - pero he estado usando esto.

+0

¡Dulce y simple! –

+1

Esta es una respuesta bastante Steller – Macdiesel

+0

Esto no está funcionando para mí, porque la extensión que estoy usando es para un directorio, por lo que los LS es una lista del contenido del directorio. –

27

egrep - grep extendido - ayudará aquí

ls | egrep '\.mp4$|\.mp3$|\.exe$' 

debe hacer el trabajo.

+0

¡Eso es todo! Gracias Acabo de dar cuenta que debería tenerlo insensible a mayúsculas y minúsculas, entonces estoy usando: ls | egrep -i '\ .mp4 $ | \ .mp3 $ | \ .exe $ En caso de que alguien más necesite ayuda con ese día. Siempre me sorprende la velocidad con la que obtengo mi respuesta aquí. – Mint

+0

No puedo ver cómo funcionaría esto. ls sin ninguna opción produce salida en columnas. El anclaje al final de la línea no coincidirá adecuadamente. – camh

+4

@camh: 'ls' a un terminal (o con la opción' -C') produce salida de varias columnas. 'ls' a una tubería (o con' -1') tiene salida de columna única. (Compare la salida de 'ls' con' ls | cat'). – mob

2
ls | grep "\.mp4$ 
\.mp3$ 
\.exe$" 
+0

¿Podría explicar el voto abajo, por favor? –

+0

Gracias, pero un poco inconveniente usando varias líneas. – Mint

+0

Este + 'mdfind' produce las mejores/más rápidas búsquedas ¡NUNCA! 'mdfind -name querystring | grep "\ .h $" 'encuentra todos los encabezados con quesrystring en el título del archivo. pronto. –

9

la forma más fácil es usar ls

ls *.mp4 *.mp3 *.exe 
+1

Gracias, pero ya lo intenté y no me gustaron los errores que se producen cuando no hay ningún archivo. Tú pudiste haber solucionado eso al hacer: ls * .mp4 * .mp3 * .exe 2>/dev/null Sólo pensé en eso ahora: P – Mint

+0

Me sorprende que 'ls' no tenga algún tipo de de la opción silenciosa. – MitMaro

+0

Ninguna que pude encontrar. – Mint

5

No hay necesidad de grep. Los comodines de Shell harán el truco.

ls *.mp4 *.mp3 *.exe 

Si ha ejecutado

shopt -s nullglob 

continuación pegotes incomparables serán eliminados por completo y no se puede dejar en la línea de comandos no expandido.

Si desea entre mayúsculas y minúsculas se estaban utilizando comodines (* .mp3 por lo coincidirá foo.MP3):

shopt -s nocaseglob 
+0

mismo comentario que me dio a Good Time tribu. – Mint

7

Por si acaso: ¿por qué no utilizar find?

find -iname '*.mp3' -o -iname '*.exe' -o -iname '*.mp4' 
+0

Gracias! Exactamente lo que necesitaba. – Stratus3D

4

En caso de que todavía están buscando una solución alternativa:

ls | grep -i -e '\\.tcl$' -e '\\.exe$' -e '\\.mp4$' 

agrega a más banderas -e si es necesario.

35

utilizar expresiones regulares con find:

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\n' 

Si usted está canalizando los nombres de archivo:

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\0' | xargs -0 dosomething 

Esto protege los nombres de archivo que contienen espacios o saltos de línea.

OS X find solo admite la alternancia cuando se utiliza la opción -E (mejorada).

find -E . -regex '.*\.(mp3|mp4|exe)' 
+2

En Mac OS X: 'buscar. -iregex '. * \ (mp3 \ | mp4 \ | exe \)' ' – andi

+3

andi, eso no funcionó para mí en mac os. Pero esto hizo: encontrar -E. -regex '. * (mp3 | mp4 | exe)' –

+0

Esta solución cargará archivos como: 'mysupermp3.jpg' considerar agregar el' $ 'al final de la expresión regular y el' \\. 'antes de las extensiones – Panthro

2

ls -R | findstr ".mp3"

ls -R => Muestra subdirectorios recursivamente

3

Para usuarios de OSX:

Si utiliza ls *.{mp3,exe,mp4}, se generará un error si una de esas extensiones tiene no hay resultados.

El uso de ls *.(mp3|exe|mp4) devolverá todos los archivos que coincidan con esas extensiones, , incluso si una de las extensiones tiene 0 resultados.

+3

Obtuve un error de sintaxis con su ejemplo ??? 'bash: error de sintaxis cerca de token inesperado '(' – nagordon

+0

Esto funciona para mí en OSX, ¿estás usando linux? – james2doyle

+0

Linux mint (debian) – nagordon

0

Aquí hay un ejemplo que funcionó para mí.

find <mainfolder path> -name '*myfiles.java' | xargs -n 1 basename 
Cuestiones relacionadas