Pourquoi ma boucle sur la sortie de ls ne fonctionne-t-elle pas?

J'essaie de fournir des noms de directorys dans une boucle for. Mon code est comme suit:

td='/Test/TopDir/' cd "$td" for x in $(ls -d */ | cut -f1 -d'/'); do echo x=$x done 

Le premier directory que je lance ceci ressemble à ceci quand j'exécute une command ls:

 ls -l drwxrwxrwx 4 Jason users 4096 May 6 06:36 2014-02-02 - Jebby ( drwxrwxrwx 3 Jason users 4096 May 6 06:09 2014-02-04 - Jebby ( drwxrwxrwx 2 root root 4096 May 6 06:09 @eaDir -rw-r--r-- 1 Jason users 3956225 Jan 26 10:17 DSC01062.JPG -rw-r--r-- 1 Jason users 3927603 Jan 26 10:18 DSC01063.JPG 

Les résultats de ma boucle for sont les suivants:

 x=2014-02-02 x=- x=Jebby x=( x=2014-02-04 x=- x=Jebby x=( x=@eaDir 

Comme vous pouvez le voir, la boucle for casse les noms de directorys en sous-éléments après chaque espace. Dans cet exemple, je veux seulement que la boucle For s'exécute trois fois avec les trois directorys:

  1. 2014-02-02 – Jebby (
  2. 2014-02-04 – Jebby (
  3. @eaDir

Qu'est-ce que je fais mal?

Évitez d'parsingr la sortie (ou au less la partie nom de file) de ls dans les scripts shell si possible. Il donnera toujours des problèmes avec le partage de mots où les noms de files contiennent des espaces.

Si vous voulez parcourir les directorys, vous pouvez le faire en utilisant un simple shell glob ie

 for d in */; do echo "$d" done 

La command ls doit uniquement être utilisée pour afficher les lists de directorys sous une forme lisible par l'homme dans le terminal.

En utilisant la suggestion de @ mikserv, vous pouvez faire

 cd /Test/TopDir/ set -- "$PWD" */ cd /somewhere/else td=$1 ; shift for x; do echo x="${td}/$x" done