web-dev-qa-db-fra.com

Comment capturer la sortie de la commande ls ou find pour stocker tous les noms de fichiers dans un tableau?

Besoin de traiter les fichiers dans le répertoire actuel un par un. Je cherche un moyen de prendre la sortie de ls ou find et de stocker la valeur résultante en tant qu'éléments d'un tableau. De cette façon, je peux manipuler les éléments du tableau selon les besoins.

33
fzkl

Pour répondre à votre question exacte, utilisez ce qui suit:

arr=( $(find /path/to/toplevel/dir -type f) )

Exemple

$ find . -type f
./test1.txt
./test2.txt
./test3.txt
$ arr=( $(find . -type f) )
$ echo ${#arr[@]}
3
$ echo ${arr[@]}
./test1.txt ./test2.txt ./test3.txt
$ echo ${arr[0]}
./test1.txt

Cependant, si vous voulez simplement traiter les fichiers un par un, vous pouvez utiliser soit le find-exec option si le script est quelque peu simple, ou vous pouvez faire une boucle sur ce que find retourne comme ceci:

while IFS= read -r -d $'\0' file; do
  # stuff with "$file" here
done < <(find /path/to/toplevel/dir -type f -print0)
49
SiegeX
for i in `ls`; do echo $i; done;

ne peut pas être plus simple que ça!

edit: hmm - selon le commentaire de Dennis Williamson, il semble que vous puissiez!

edit 2: bien que l'OP demande spécifiquement comment analyser la sortie de ls, je voulais juste souligner que, comme l'ont dit les commentateurs ci-dessous, la bonne réponse est "vous ne le faites pas". Utilisation for i in * ou similaire à la place.

9
simon

En fait, vous n'avez pas besoin d'utiliser ls/find pour les fichiers du répertoire courant.

Utilisez simplement une boucle for:

for files in *; do 
    if [ -f "$files" ]; then
        # do something
    fi
done

Et si vous souhaitez également traiter les fichiers cachés, vous pouvez définir l'option relative:

shopt -s dotglob

Cette dernière commande ne fonctionne qu'en bash.

4
marco