¿La mejor manera de expandir el patrón glob?

29

Necesito expandir un patrón global (como ../smth*/*, o /etc/cron*/) en una lista de archivos, mediante programación. ¿Cuál sería la mejor manera de hacerlo?

Rogach
fuente
2
No necesita hacer nada especial, simplemente no cite el *.
Kevin
1
Aunque si vas a intentar analizarlo, usa una matriz como dice la respuesta.
Kevin

Respuestas:

40

Simplemente deje que se expanda dentro del lado derecho de una declaración de matriz:

list=(../smth*/)          # grab the list
echo "${#list[@]}"        # print array length
echo "${list[@]}"         # print array elements
for file in "${list[@]}"; do echo "$file"; done  # loop over the array


Tenga en cuenta que la opción de shell nullglobdebe establecerse.
No está configurado por defecto.
Evita un error en caso de que el globo (o uno de varios globos) no coincida con ningún nombre.

Configúralo bashcon

shopt -s nullglob

o zshcon

setopt nullglob
hombre trabajando
fuente
¿Y cómo imprimo esa lista después?
Rogach
Es solo una matriz regular. Puedes hacer lo que puedas con cualquier matriz. Se agregaron algunos ejemplos.
manatwork
1
Hay un problema. Si el patrón no coincide con ningún archivo, se imprime, lo que no es muy bueno.
Rogach
55
Ah, shopt -s nullglob lo resuelve.
Rogach
1
@lindhe, unsetopty el mismo parámetro utilizado para setopt.
manatwork
-1

No es necesario complicar demasiado las cosas:

echo your/stuff*
Alexei Averchenko
fuente
Esto no funciona. Por ejemplo: TEST=$(echo your/stuff*) && eval \"$TEST\"saldrá:your/stuff*: No such file or directory
Sebastian
@Sebastian, este es un problema de nulo globo, ver arriba
Alexei Averchenko
1
No, no es un problema de globo nulo. El uso de caracteres de escape es evaluar la TESTvariable como una cadena que incluye *y no se expande.
Sebastián