vectores scripts script recorrer ejemplos arreglos array arrays linux bash shell ls

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