arrays - recorrer - scripts bash ejemplos
¿Cómo asigno ls a una matriz en Linux Bash? (3)
array=${ls -d */}
echo ${array[@]}
Tengo tres directorios: ww
ee
qq
. Los quiero en una matriz y luego imprimo la matriz.
Esto imprimiría los archivos en esos directorios línea por línea.
array=(ww/* ee/* qq/*)
printf "%s/n" "${array[@]}"
Sería esto
array=($(ls -d */))
EDITAR: Vea la solución de Gordon Davisson para una respuesta más general (es decir, si sus nombres de archivo contienen caracteres especiales). Esta respuesta es simplemente una corrección de sintaxis.
Siempre que sea posible, debe evitar analizar la salida de ls
(consulte la wiki de Greg sobre el tema ). Básicamente, el resultado de ls
será ambiguo si hay caracteres graciosos en cualquiera de los nombres de archivo. También suele ser una pérdida de tiempo. En este caso, cuando ejecuta ls -d */
, lo que sucede es que el shell se expande */
a una lista de subdirectorios (que ya es exactamente lo que desea), pasa esa lista como argumentos a ls -d
, que mira cada uno, dice "sí, eso es un directorio correcto" y lo imprime. ¡El comando ls
no está haciendo nada útil!
Bueno, está haciendo una cosa que es útil: si no hay subdirectorios, */
quedará como está, buscará un subdirectorio llamado "*", no lo encontrará, imprimirá un mensaje de error que no lo haga existe (a stderr), y no imprime "* /" (a stdout).
La forma más limpia de crear una matriz de nombres de subdirectorios es usar glob ( */
) sin pasarlo a ls
. Pero para evitar poner "* /" en la matriz si no hay subdirectorios reales, primero debe establecer nullglob (nuevamente, vea la wiki de Greg ):
shopt -s nullglob
array=(*/)
shopt -u nullglob # Turn off nullglob to make sure it doesn''t interfere with anything later
echo "${array[@]}" # Note double-quotes to avoid extra parsing of funny characters in filenames
Si desea imprimir un mensaje de error si no hay subdirectorios, es mejor que lo haga usted mismo:
if (( ${#array[@]} == 0 )); then
echo "No subdirectories found" >&2
fi