web-dev-qa-db-fra.com

Comment attribuer ls à un tableau dans Linux Bash?

array=${ls -d */}
echo ${array[@]}  

J'ai trois répertoires: wweeqq. Je les veux dans un tableau et ensuite imprimer le tableau.

62
Jordin Youssef

Ce serait ceci

array=($(ls -d */))

EDIT: Voir la solution de Gordon Davisson pour une réponse plus générale (c'est-à-dire si vos noms de fichiers contiennent des caractères spéciaux). Cette réponse est simplement une correction de syntaxe.

82
Aaron Okano

Autant que possible, vous devriez éviter d'analyser le résultat de ls (voir wiki de Greg sur le sujet ). Fondamentalement, le résultat de ls sera ambigu s'il existe des caractères amusants dans l'un des noms de fichiers. C'est aussi généralement une perte de temps. Dans ce cas, lorsque vous exécutez ls -d */, le shell s’agrandit */ à une liste de sous-répertoires (ce qui est déjà exactement ce que vous voulez), transmet cette liste en tant qu’arguments à ls -d, qui regarde chacune d’elles, dit "ouais, c’est un bon répertoire" et l’imprime. La commande ls ne fait rien d’utile!

Bon, d'accord, c'est une chose utile: s'il n'y a pas de sous-répertoires, */ sera laissé tel quel, ls recherchera un sous-répertoire nommé "*", ne le trouvera pas, affichera un message d'erreur indiquant qu'il n'existe pas (pour stderr), et pas affiche le "* /" (sur la sortie standard).

La méthode la plus simple pour créer un tableau de noms de sous-répertoires consiste à utiliser le glob (*/) sans passer à ls. Mais pour éviter de mettre "* /" dans le tableau s'il n'y a pas de sous-répertoires réels, vous devez d'abord définir nullglob (à nouveau, voir 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 vous souhaitez imprimer un message d'erreur s'il n'y a pas de sous-répertoires, vous feriez mieux de le faire vous-même:

if (( ${#array[@]} == 0 )); then
    echo "No subdirectories found" >&2
fi
57
Gordon Davisson

Cela imprimerait les fichiers de ces répertoires ligne par ligne.

array=(ww/* ee/* qq/*)
printf "%s\n" "${array[@]}"
6
konsolebox