J'essaie de stocker la liste des fichiers dans un tableau, puis de le parcourir à nouveau. Voici ce que je reçois lorsque j’exécute la commande ls -ls
à partir de la console.
total 40
36 -rwxrwxr-x 1 amit amit 36720 2012-03-31 12:19 1.txt
4 -rwxrwxr-x 1 amit amit 1318 2012-03-31 14:49 2.txt
Le script bash suivant que j'ai écrit pour stocker les données ci-dessus dans un tableau bash.
i=0
ls -ls | while read line
do
array[ $i ]="$line"
(( i++ ))
done
Mais quand je echo $array
, je ne reçois rien!
Pour info, je lance le script de cette façon: ./bashscript.sh
Essayez avec:
#! /bin/bash
i=0
while read line
do
array[ $i ]="$line"
(( i++ ))
done < <(ls -ls)
echo ${array[1]}
Dans votre version, la while
s'exécute dans un sous-shell, les variables d'environnement que vous modifiez dans la boucle ne sont pas visibles en dehors de celle-ci.
(N'oubliez pas que l'analyse de la sortie de ls
est généralement pas une bonne idée du tout .)
J'utiliserais
files=(*)
Ensuite, si vous avez besoin de données sur le fichier, telles que la taille, utilisez la commande stat
de chaque fichier.
Voici une variante qui vous permet d'utiliser un motif regex pour le filtrage initial, changez-le pour obtenir le filtrage souhaité.
files=($(find -E . -type f -regex "^.*$"))
for item in ${files[*]}
do
printf " %s\n" $item
done
Cela pourrait fonctionner pour vous:
OIFS=$IFS; IFS=$'\n'; array=($(ls -ls)); IFS=$OIFS; echo "${array[1]}"
L'exécution d'une commande Shell dans $(...)
aidera à stocker le résultat dans une variable. Donc, en utilisant cela, nous pouvons convertir les fichiers en tableau avec IFS
.
IFS=' ' read -r -a array <<< $(ls /path/to/dir)