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

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

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

Ç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 ‘-’ et des ‘.’ pour les extensions.

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 ‘-’ et des ‘.’ 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 !

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
#! /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
#! /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

Salut,

Pourquoi pas :

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

^^ ?

Bonjour,

Devrait résoudre ton problème :wink:

michauko.org/blog/2009/01/15/ifs … ipts-bash/

+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?

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

[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]

Plus simple :

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

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

[quote=“MisterFreez”]Plus simple :
[…][/quote]
+1

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)

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

for repertoire in */
do
 [traitement]
done

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)

pas en dash.
en revanche, bash le permet :

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

Avec dash, tu peux faire :

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