Comment capturer la sortie de la commande ls ou trouver la commande pour stocker tous les noms de fichiers dans un tableau?
Question
Nécessité de traiter des fichiers dans un répertoire en cours à la fois. Je cherche un moyen de prendre la sortie de ls
ou find
et stocker la valeur résultante comme éléments d'un tableau. De cette façon, je peux manipuler les éléments du tableau selon les besoins.
La solution
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 juste des fichiers de traiter une à la fois, vous pouvez l'option find
de soit utiliser -exec
si le script est assez simple, ou vous pouvez faire une boucle sur ce que trouver des retours comme ceci:
while IFS= read -r -d $'\0' file; do
# stuff with "$file" here
done < <(find /path/to/toplevel/dir -type f -print0)
Autres conseils
for i in `ls`; do echo $i; done;
ne peut pas obtenir plus simple que cela!
modifier: hmm - selon le commentaire de Dennis Williamson, il semble que vous pouvez
modifier 2: bien que l'OP demande spécifiquement comment analyser la sortie de ls
, je voulais juste faire remarquer que, comme les commentateurs ci-dessous ont dit, la bonne réponse est « vous n'avez pas ». Utilisez for i in *
ou similaire à la place.
En fait, vous n'avez pas besoin d'utiliser ls / trouver des fichiers dans le répertoire courant.
Il suffit d'utiliser une boucle:
for files in *; do
if [ -f "$files" ]; then
# do something
fi
done
Et si vous voulez traiter les fichiers cachés aussi, vous pouvez définir l'option relative:
shopt -s dotglob
Cette dernière commande ne fonctionne que dans bash.
En fonction de ce que vous voulez faire, vous pouvez utiliser xargs:
ls directory | xargs cp -v dir2
Par exemple. xargs agir sur chaque article retourné.