J'ai un shell bash script qui boucle sur tous les répertoires enfants (mais pas les fichiers) d'un certain répertoire. Le problème est que certains des noms de répertoire contiennent des espaces.
Voici le contenu de mon répertoire de test :
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
Et le code qui boucle sur les répertoires :
for f in `find test/* -type d`; do
echo $f
done
Voici le résultat :
test/Baltimore
test/Cherry
Hill
test/Edison
test/New
York
City
test/Philadelphia
Cherry Hill et New York City sont traités comme 2 ou 3 entrées distinctes.
J'ai essayé de citer les noms de fichiers, comme ceci :
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
mais en vain.
Il doit y avoir un moyen simple de faire ça.
Les réponses ci-dessous sont excellentes. Mais pour rendre les choses plus compliquées, je ne veux pas toujours utiliser les répertoires listés dans mon répertoire de test. Parfois, je veux passer les noms des répertoires en tant que paramètres de ligne de commande.
J'ai suivi la suggestion de Charles de régler l'IFS et j'ai obtenu les résultats suivants :
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
et cela fonctionne parfaitement, sauf s'il y a des espaces dans les arguments de la ligne de commande (même si ces arguments sont cités). Par exemple, appeler le script comme ceci : test.sh "Cherry Hill" "New York City"
produit la sortie suivante :
Cherry
Hill
New
York
City
0 votes
Re : edit,
list="$@"
élimine complètement le caractère de liste de la valeur originale, la réduisant à une chaîne de caractères. Veuillez suivre les pratiques décrites dans ma réponse exactement comme indiqué -- Si vous voulez passer une liste d'arguments de ligne de commande à un programme, vous devez les rassembler dans un tableau, et développer ce tableau directement.