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:
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