113 votes

Comment puis-je attribuer ls à un tableau en Linux Bash ?

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

J'ai trois répertoires : ww ee qq. Je veux les mettre dans un tableau et ensuite afficher le tableau.

152voto

Aaron Okano Points 2113

Il s'agirait de ceci

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

MODIFIER : 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 n'est qu'une correction de syntaxe.

100voto

Gordon Davisson Points 22534

Chaque fois que possible, vous devriez éviter de parser la sortie de ls (voir le wiki de Greg sur le sujet). Fondamentalement, la sortie de ls sera ambiguë s'il y a des caractères spéciaux 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 */, ce qui se passe est que le shell développe */ en une liste de sous-répertoires (ce qui est déjà exactement ce que vous voulez), transmet cette liste en arguments à ls -d, qui regarde chacun, dit "oui, c'est bien un répertoire" et l'affiche (dans un format incohérent et parfois ambigu). La commande ls ne fait rien de utile!

Bon, d'accord, elle fait une chose qui est utile : s'il n'y a pas de sous-répertoires, */ restera tel quel, ls cherchera un sous-répertoire nommé "*", ne le trouvera pas, imprimera un message d'erreur disant qu'il n'existe pas (sur stderr), et ne n'imprimera pas "*/" (sur stdout).

La manière plus propre de créer un tableau de noms de sous-répertoires est d'utiliser le glob (*/) sans le passer à ls. Mais afin d'éviter de mettre "*/" dans le tableau s'il n'y a pas de sous-répertoires réels, vous devriez d'abord définir nullglob (encore une fois, voir le wiki de Greg) :

shopt -s nullglob
array=(*/)
shopt -u nullglob # Désactivez nullglob pour vous assurer qu'il n'interfère pas avec quoi que ce soit plus tard
echo "${array[@]}"  # Remarquez les guillemets doubles pour éviter un parsing supplémentaire des caractères spéciaux dans les noms de fichiers

Si vous voulez imprimer un message d'erreur s'il n'y a pas de sous-répertoires, il vaut mieux le faire vous-même :

if (( ${#array[@]} == 0 )); then
    echo "Aucun sous-répertoire trouvé" >&2
fi

15voto

konsolebox Points 21338

Cela afficherait les fichiers dans ces répertoires ligne par ligne.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X