J'ai un fichier, appelé file_list
, contenant des chaînes délimitées par des espaces, chacune étant le nom d'un fichier à traiter. Je souhaite maintenant parcourir tous les noms de fichiers et les traiter un par un. Le pseudocode est
for every filename in file_list
process(filename);
end
J'ai trouvé une solution plutôt maladroite, qui est
filenames='cat file_list'
N
, par tr -cd ' ' <temp_list | wc -c
N
et analyse par espace chaque nom de fichier avec cut
Existe-t-il une manière plus simple/plus élégante de procéder?
La façon la plus simple de le faire est une astuce classique qui est dans le Bourne Shell depuis un certain temps.
for filename in `cat file_list`; do
# Do stuff here
done
Vous pouvez modifier le fichier pour que les mots soient séparés par des lignes plutôt que par des espaces. De cette façon, vous pouvez utiliser la syntaxe typique:
while read line
do
do things with $line
done < file
Avec tr ' ' '\n' < file
vous remplacez les espaces par de nouvelles lignes, pour que cela fasse:
while read line
do
do things with $line
done < <(tr ' ' '\n' < file)
$ cat a
hello this is a set of strings
$ while read line; do echo "line --> $line"; done < <(tr ' ' '\n' < a)
line --> hello
line --> this
line --> is
line --> a
line --> set
line --> of
line --> strings