J'ai un script shell bash qui parcourt 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 parcourt les répertoires:
for f in `find test/* -type d`; do
echo $f
done
Voici le résultat:
test / Baltimore test / Cerise Colline test / Edison test / Nouveau York Ville test / Philadelphie
Cherry Hill et New York sont traitées 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 le faire.
Les réponses ci-dessous sont excellentes. Mais pour rendre cela plus compliqué, je ne veux pas toujours utiliser les répertoires répertoriés dans mon répertoire de test. Parfois, je veux passer les noms de répertoire en tant que paramètres de ligne de commande à la place.
J'ai pris la suggestion de Charles de configurer l'IFS et j'ai trouvé ce qui suit:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
et cela fonctionne très bien sauf s'il y a des espaces dans les arguments de la ligne de commande (même si ces arguments sont entre guillemets). Par exemple, appeler le script comme ceci: test.sh "Cherry Hill" "New York City"
produit la sortie suivante:
Cerise Colline Nouveau York Ville
list="$@"
rejette complètement la liste de la valeur d'origine, la réduisant en une chaîne. Veuillez suivre les pratiques de ma réponse exactement telles qu'elles ont été données - une telle affectation n'est encouragée nulle part; si vous souhaitez transmettre une liste d'arguments de ligne de commande à un programme, vous devez les rassembler dans un tableau et développer ce tableau directement.