web-dev-qa-db-fra.com

Comment stocker les fichiers de répertoires listés dans un tableau?

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

32
codef0rmer

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 .)

30
Mat

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.

82
glenn jackman

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
4
harschware

Cela pourrait fonctionner pour vous:

OIFS=$IFS; IFS=$'\n'; array=($(ls -ls)); IFS=$OIFS; echo "${array[1]}"
4
potong

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)
0
rashok