Simple Unix moyen d'une boucle dans l'espace délimité par des cordes?
J'ai un fichier, appelé file_list
, contenant un espace délimité par des cordes, dont chacun est un nom de fichier d'un fichier à traiter. Je souhaite maintenant faire une boucle par tous les noms de fichier et de les traiter un par un. Pseudocode est
for every filename in file_list
process(filename);
end
Je suis venu avec un plutôt maladroit solution, qui est
- charger le fichier dans une variable par
filenames='cat file_list'
- compter le nombre d'espaces,
N
, partr -cd ' ' <temp_list | wc -c
- boucle de 1 à
N
et d'analyser en l'espace de chaque nom de fichier aveccut
Est-il plus facile/moyen plus élégant de le faire?
Avez-vous essayé
Non, je n'ai pas. Ce travail? (un peu surprise de voir que c'est si simple), je suis en utilisant bash.
Il fonctionne réellement! Merci beaucoup! Choqué par mon ahurissant.. LOL
for fname in $file_list
? Ce shell que vous utilisez?Non, je n'ai pas. Ce travail? (un peu surprise de voir que c'est si simple), je suis en utilisant bash.
Il fonctionne réellement! Merci beaucoup! Choqué par mon ahurissant.. LOL
for fname in $file_list
devrait pas travail: qui passe en boucle sur les noms à l'intérieur de la variable $file_name
. Mais dans votre question, vous avez dit que c'était pas une variable, mais le nom d'un fichier.OriginalL'auteur Sibbs Gambling | 2014-09-16
Vous devez vous connecter pour publier un commentaire.
La façon la plus simple de le faire est un classique de la tour qui a été dans le bourne shell pour un certain temps.
Aucun des noms de fichier sont même capables de contenir des espaces parce qu'ils sont délimité par par des espaces. Aussi, je doute que vous avez un fichier nommé *.
Le doute n'est pas un bon substitut pour la sécurité. Un fichier avec
[1]
dans le nom peut aussi causer des problèmes, par exemple. Et oui, comme je l'ai édité mon commentaire pour dire que dans ce cas, la solution est plus sûre que dans d'autres, parce que le principal problème est effectivement le comportement, mais le reste est toujours possible.Vrai, donc ce n'est certainement pas un programme qui doit être exécuté avec les privilèges de root ou via un réseau. Bien qu'elle donne shell globing comme une caractéristique.
Si bash, utilisez le builtin
for filename in $(< file_list)
OriginalL'auteur randomusername
Vous pouvez modifier le fichier de mots être des lignes séparées au lieu d'séparés par un espace. De cette façon, vous pouvez utiliser la syntaxe typique:
Avec
tr ' ' '\n' < file
vous remplacez les espaces avec de nouvelles lignes, de sorte que cela devrait faire:Test
tr
. Utiliser des tableaux à la place. Puisque vous êtes à l'aide de processus de substitution il est sûr de supposer que le shell est bash.while IFS= read -ra filename; do printf "file -- %s\n" ${filename[@]}; done < a
OriginalL'auteur fedorqui