Aunque el uso de find
comandos puede ser útil aquí, el shell en sí mismo proporciona opciones para cumplir este requisito sin herramientas de terceros. losbash
shell proporciona una opción de soporte global extendido mediante la cual puede obtener los nombres de archivo en rutas recursivas que coincidan con las extensiones que desee.
La opción extendida es la extglob
que debe configurarse utilizando la shopt
opción que se muestra a continuación. Las opciones están habilitadas con el -s
soporte y deshabilitadas con la -u
bandera. Además, podría usar un par de opciones más, es decir, nullglob
en el que un globo incomparable se elimina por completo, reemplazado por un conjunto de cero palabras. Y globstar
eso permite recurrir a través de todos los directorios.
shopt -s extglob nullglob globstar
Ahora todo lo que necesita hacer es formar la expresión global para incluir los archivos de una determinada extensión, que puede hacer como se muestra a continuación. Usamos una matriz para llenar los resultados globales porque cuando se citan correctamente y se expanden, los nombres de archivo con caracteres especiales permanecerían intactos y no se romperían debido a la división de palabras por el shell.
Por ejemplo, para enumerar todos los *.csv
archivos en las rutas recursivas
fileList=(**/*.csv)
La opción **
es recurrir a través de las subcarpetas y *.csv
es una expansión global para incluir cualquier archivo de las extensiones mencionadas. Ahora para imprimir los archivos reales, solo haz
printf '%s\n' "${fileList[@]}"
Usar una matriz y hacer una expansión entre comillas adecuada es la forma correcta cuando se usa en scripts de shell, pero para uso interactivo, simplemente puede usar ls
con la expresión global como
ls -1 -- **/*.csv
Esto podría muy bien expandirse para que coincida con varios archivos, es decir, el archivo que termina con una extensión múltiple (es decir, similar a agregar varios indicadores en el find
comando). Por ejemplo, considere un caso de necesidad de obtener todos los archivos de imágenes recursivas, es decir, de extensiones *.gif
, *.png
y *.jpg
todo lo que necesita es
ls -1 -- **/+(*.jpg|*.gif|*.png)
Esto podría muy bien expandirse para tener resultados negativos también. Con la misma sintaxis, uno podría usar los resultados del globo para excluir archivos de cierto tipo. Suponga que desea excluir los nombres de archivo con las extensiones anteriores, podría hacer
excludeResults=()
excludeResults=(**/!(*.jpg|*.gif|*.png))
printf '%s\n' "${excludeResults[@]}"
La construcción !()
es una operación negativa para no incluir ninguna de las extensiones de archivo enumeradas en el interior y |
es un operador de alternancia tal como se usa en la biblioteca de Expresiones regulares extendidas para hacer una coincidencia OR de los globos.
Tenga en cuenta que este soporte global extendido no está disponible en el shell POSIX bourne y es puramente específico de las versiones recientes de bash
. Entonces, si está considerando la portabilidad de los scripts que se ejecutan en POSIX y bash
shells, esta opción no sería la correcta.