Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
[shell] nom de fichier avec espaces
Envoyé par: bratack

Bonjour à tous,

Mon problème est très simple.
Lorsque je veux faire un traitement sur une liste de fichiers dans un répertoire, les fichiers ayant un nom contenant un espace sont décomposés en 2 noms.

le code suivant pour un répertoire contenant le fichier document 1.txt, me retourne document et 1.txt


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

Merci d'avance de vos lumières.

Cdt,
B

Poste le Wednesday 8 November 2006 11:25:47
Répondre     Citer    
Re: [shell] nom de fichier avec espaces

Utiliser
echo "$list"

et plus généralement, prend le temps de lire en détail la documentation de ton shell (bash ou zsh). Il faut notamment comprendre comment le shell transforme les lignes de commandes en des appels systèmes [fr.wikipedia.org], notamment execve, pipe, dup et fork. Un programme reçoit (via son main, par execve) un tableau d'arguments (et un autre d'environnement).

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Wednesday 8 November 2006 11:32:45
Répondre     Citer    
Re: [shell] nom de fichier avec espaces
Envoyé par: bratack

Merci Basile, il ne me reste plus qu'a postasser mon "man bash" :-))

Dernière petite question, quelle syntaxe utiliser pour le cas suivant comme le prmier:


#!/bin/sh
for list in `find -type f`
do
        echo $list
done


Poste le Wednesday 8 November 2006 12:24:02
Répondre     Citer    
Re: [shell] nom de fichier avec espaces

Je suggère plutot
find -type f -exec echo '{}' \;
ou bien
find -type f | xargs echo
Et sous zsh plus simplement
echo **/*(.)

Pour les détails, RTFM ;-) (info find; man xargs; info zsh).

Toutefois, j'ajouterais quelques remarques

la première, c'est qu'on ne comprend pas exactement ce que tu cherches. Tu ferais mieux d'exposer le problème exact que tu veux résoudre (ce n'est certainement pas afficher la liste des fichiers d'une arborescence).

la deuxième, c'est que pour des traitements qui pourraient être compliqués, un script en shell n'est pas forcément la meilleure solution. Par exemple, dans des langages de script comme Ruby, c'est plus simple. A mon avis, au delà de 20 à 50 lignes, le shell n'est pas forcément le langage le plus adapté.

Et sur ce site Léa ces problèmes ont été évoqués et résolus maintes fois... tu ferais mieux d'y chercher d'autres messages ou des tutoriels.

Il est également possible que tu cherches à traiter un problème classique (peut-être la sauvegarde de fichiers selectivement) bien résolu par d'autres outils (afio, rdist, rsync, unison).




----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Wednesday 8 November 2006 14:56:02
Répondre     Citer    
Re: [shell] nom de fichier avec espaces
Envoyé par: bratack

Merci pour les infos, ça fonctionne.
Je prends note de tes remarques pour la prochaine.

Poste le Wednesday 8 November 2006 15:58:19
Répondre     Citer    
Re: [shell] nom de fichier avec espaces
Envoyé par: Sve@r

Citation
bratack
Dernière petite question, quelle syntaxe utiliser
pour le cas suivant comme le prmier:


#!/bin/sh
for list in `find -type f`
do
echo $list
done

La syntaxe
for arg in `cde`
possède l'inconvénient que si un des éléments sortis par la commande possède un espace, le "for" découpera cet élément en 2 itérations distinctes toutes deux fausses et l'élément ne sera pas traité.
Je préfère la syntaxe
cde |while read arg
car le read possède l'avantage indiscutable de découper ses valeurs sur le "return" et non sur l'espace.
Donc ta structure pourraît être
#!/bin/sh
find -type f |while read list
do
        echo $list
done

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Friday 10 November 2006 20:53:18
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
[shell] nom de fichier avec espaces
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons