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.
Pour répondre à votre question exacte, utilisez ce qui suit:
arr=( $(find /path/to/toplevel/dir -type f) )
$ 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)
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.
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.