# For i in \`ls\`, et noms de répertoire avec espace

**URL:** <https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 12:16 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847 "2016-02-21T00:16:41Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![Glorf](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/g/d6d6ee/32.png) [@Glorf](https://www.debian-fr.org/u/Glorf)\
**Post date:** [Février 21, 2016, 12:16 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/1 "2016-02-21T00:16:41Z")

</div>

Bonjour,  
j’ai un problème avec le script suivant :

`#!/bin/bash
for repertoire in `ls`
do
    echo "$repertoire"
done
`  
J’ai un nom de répertoire avec un espace dedans, et du coup, il me le traite comme 2 entrées différentes dans mon for … Comment je peux éviter ça ?  
La preuve par l’exemple :

`glorf@debian-desktop64-maman:~/code$ ls
Dof'Graph find_rangement.sh rangement.sh rangement.sh.save test lolilol test.sh
glorf@debian-desktop64-maman:~/code$ ./test.sh
Dof'Graph
find_rangement.sh
rangement.sh
rangement.sh.save
test
lolilol
test.sh
`  
Cordialement,  
Glorf

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 12:16 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/2 "2016-02-21T00:16:41Z")

</div>

Et ça te pose vraiment un problème d’ajouter un ‘-’ ou un ‘\_’ au nom de ton rep ?

---

<div class="post-metadata">

**Author:** ![Glorf](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/g/d6d6ee/32.png) [@Glorf](https://www.debian-fr.org/u/Glorf)\
**Post date:** [Février 21, 2016, 12:16 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/3 "2016-02-21T00:16:41Z")

</div>

Ça serait pour ranger des répertoires, donc je peux pas tous les trouver à la main … Et puis, un espace dans un nom de répertoire, c’est pas si exotique que ça …

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 12:16 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/4 "2016-02-21T00:16:42Z")

</div>

> [@Glorf](#):
>
> Ça serait pour ranger des répertoires, donc je peux pas tous les trouver à la main … Et puis, un espace dans un nom de répertoire, c’est pas si exotique que ça …

Question de principe, pour éviter ce genre de désagréments, moi, que ce soit fichier ou dossier, tout est exclusivement écrit en minuscules, sans accents et sans espacement, seulement des ‹&nbsp;-&nbsp;› et des ‹&nbsp;.&nbsp;› pour les extensions.

---

<div class="post-metadata">

**Author:** ![Glorf](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/g/d6d6ee/32.png) [@Glorf](https://www.debian-fr.org/u/Glorf)\
**Post date:** [Février 21, 2016, 12:16 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/5 "2016-02-21T00:16:42Z")

</div>

> [@ricardo](#):
>
> [quote=«&nbsp;Glorf&nbsp;»]Ça serait pour ranger des répertoires, donc je peux pas tous les trouver à la main … Et puis, un espace dans un nom de répertoire, c’est pas si exotique que ça …

Question de principe, pour éviter ce genre de désagréments, moi, que ce soit fichier ou dossier, tout est exclusivement écrit en minuscules, sans accents et sans espacement, seulement des ‹&nbsp;-&nbsp;› et des ‹&nbsp;.&nbsp;› pour les extensions.[/quote]  
C’est en fait des vieuux backups sur un DD, avec des fichiers dans un peu tous les sens, et j’aimerais les regrouper par extension, et donc je sais pas du tout à quel nom de répertoire je dois m’attendre. Et puis bon, des noms de fichiers avec des espaces, bash devrait pouvoir gérer ça !

---

<div class="post-metadata">

**Author:** ![Niloo](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/n/c37758/32.png) [@Niloo](https://www.debian-fr.org/u/Niloo)\
**Post date:** [Février 21, 2016, 12:16 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/6 "2016-02-21T00:16:42Z")

</div>

`0:40 root@as3 ~/tmp# ll
total 24K
drwxr-xr-x 2 root root 4,0K 14 déc. 00:22 espace espace/
-rwx------ 1 root root 63 14 déc. 00:33 ls1.sh*
-rwx------ 1 root root 118 14 déc. 00:39 ls2.sh*
drwxr-xr-x 2 root root 4,0K 14 déc. 00:22 tata/
drwxr-xr-x 2 root root 4,0K 14 déc. 00:22 titi/
drwxr-xr-x 2 root root 4,0K 14 déc. 00:22 toto/`

[code]0:40 root@as3 ~/tmp# cat [ls1.sh](http://ls1.sh)  
#! /bin/bash

for repertoire in $(ls -I “\*.sh”)  
do  
echo $repertoire  
done[/code]

`0:40 root@as3 ~/tmp# ./ls1.sh
espace
espace
tata
titi
toto`

[code]0:40 root@as3 ~/tmp# cat [ls2.sh](http://ls2.sh)  
#! /bin/bash

file="/tmp/ls.txt"  
ls -I “\*.sh” \> $file

while read repertoire  
do  
echo $repertoire  
done \< $file[/code]

`0:40 root@as3 ~/tmp# ./ls2.sh
espace espace
tata
titi
toto`

---

<div class="post-metadata">

**Author:** ![Knucky](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/71e660/32.png) [@Knucky](https://www.debian-fr.org/u/Knucky)\
**Post date:** [Février 21, 2016, 12:16 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/7 "2016-02-21T00:16:43Z")

</div>

Salut,

Pourquoi pas :

```auto
find . -maxdepth 1 -mindepth 1 -type d -printf "%f\n" | while read d; do echo "$d"; done
```

^^ ?

---

<div class="post-metadata">

**Author:** ![gege2061](https://www.debian-fr.org/user_avatar/www.debian-fr.org/gege2061/32/3493_2.png) [@gege2061](https://www.debian-fr.org/u/gege2061)\
**Post date:** [Février 21, 2016, 12:16 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/8 "2016-02-21T00:16:55Z")

</div>

Bonjour,

```auto

```

Devrait résoudre ton problème 😉

[michauko.org/blog/2009/01/15/ifs … ipts-bash/](http://michauko.org/blog/2009/01/15/ifs-separateurs-scripts-bash/)

---

<div class="post-metadata">

**Author:** ![thuban](https://www.debian-fr.org/user_avatar/www.debian-fr.org/thuban/32/4177_2.png) [@thuban](https://www.debian-fr.org/u/thuban)\
**Post date:** [Février 21, 2016, 12:16 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/9 "2016-02-21T00:16:58Z")

</div>

+1 pour changer l’IFS. Je crois que c’est Misterfreez qui m’en avait parlé. C’est l’Internal File Separator. Sauf que utiliser export n’est peut-être pas le mieux?

```auto
$ ls -l
total 4
-rw-r--r-- 1 xavier xavier 0 14 déc. 16:26 coucou
-rw-r--r-- 1 xavier xavier 0 14 déc. 16:26 dur dur d'être bébé
-rwxr-xr-x 1 xavier xavier 178 14 déc. 16:25 test.sh
-rw-r--r-- 1 xavier xavier 0 14 déc. 16:26 vive le choco
```

`$ ./test.sh 
coucou
dur dur d'être bébé
test.sh
vive le choco
`  
et le script [test.sh](http://test.sh) :

[code]#!/bin/sh

#on enregistre l’IFS actuel :  
R=$IFS

#on change l’IFS, pour être un retour à la ligne  
IFS=’  
’

for i in $(ls); do  
echo $i  
done

#on rétablit l’IFS  
IFS=$R

exit 0  
[/code]

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 12:16 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/10 "2016-02-21T00:16:58Z")

</div>

Plus simple :

`#!/bin/sh
for repertoire in *
do
    echo "$repertoire"
done`

---

<div class="post-metadata">

**Author:** ![gege2061](https://www.debian-fr.org/user_avatar/www.debian-fr.org/gege2061/32/3493_2.png) [@gege2061](https://www.debian-fr.org/u/gege2061)\
**Post date:** [Février 21, 2016, 12:16 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/11 "2016-02-21T00:16:59Z")

</div>

> [@thuban](#):
>
> Sauf que utiliser export n’est peut-être pas le mieux?

Oui j’ai eu un doute sur ce coup là, je confirme que c’est inutile 😉

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 12:16 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/12 "2016-02-21T00:16:59Z")

</div>

[quote=“MisterFreez”]Plus simple :  
[…][/quote]  
[+1](http://partmaps.org/era/unix/award.html#ls)

---

<div class="post-metadata">

**Author:** ![Glorf](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/g/d6d6ee/32.png) [@Glorf](https://www.debian-fr.org/u/Glorf)\
**Post date:** [Février 21, 2016, 12:17 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/13 "2016-02-21T00:17:00Z")

</div>

Merci pour votre aide, je prends la solution de MisterFreeze, c’est la plus simple. (et j’ai appris un truc avec l’IFS aussi)

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 12:17 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/14 "2016-02-21T00:17:05Z")

</div>

à noter :  
si tu ne souhaites que les dossiers (on ne sait jamais) :

```auto
for repertoire in */
do
 [traitement]
done
```

---

<div class="post-metadata">

**Author:** ![Glorf](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/g/d6d6ee/32.png) [@Glorf](https://www.debian-fr.org/u/Glorf)\
**Post date:** [Février 21, 2016, 12:17 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/15 "2016-02-21T00:17:17Z")

</div>

Cool merci, je suis obligé de faire un if [-d $repertoire].  
Par contre, est-ce que ya moyen d’enlever du \*/ un dossier précis ? (comme le ls -I donné plus haut)

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 12:18 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/16 "2016-02-21T00:18:31Z")

</div>

pas en dash.  
en revanche, bash le permet :

```auto
shopt -s extglob
for repertoire in !(nom_dossier_non_souhaité)/
do
[...]
done
```

dans nom\_dossier\_non\_souhaité, tu peux utiliser des glob également. Ex : !(dossier\*tmp)/ traitera tous les dossiers sauf ceux dont le nom commence par dossier et qui se termine par tmp

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Février 21, 2016, 12:18 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/17 "2016-02-21T00:18:34Z")

</div>

Avec dash, tu peux faire :

```auto

```

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 12:18 UTC](https://www.debian-fr.org/t/for-i-in-ls-et-noms-de-repertoire-avec-espace/29847/18 "2016-02-21T00:18:46Z")

</div>

l’option -1 est implicite lorsque la sortie est pipée.
