Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/12/2006, 17h17   #1
Membre du Club
 
Inscription : février 2006
Messages : 55
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 55
Points : 47
Points : 47
Par défaut Incompréhension avec la commande "find"

Bonjour à tous,

voilà mon souci :

dans le cadre d'un problème que l'on m'a soumis, je cherche une solution pour renommer récursivement des noms de fichiers.
Habituellement, j'utilise cette commande (ou dérivé) :

Code :
1
2
3
for i in `find . -name "*.txt"`
       do mv $i `echo $i | sed "/txt/s//doc/"`
done
Seulement, cette fois-ci, je suis confronté à des noms de fichiers comportant des espaces... et la commande "find" ne réagie pas du tout de la même façon.
Elle m'affiche 2 occurences à cause d'un retour à la ligne lorsqu'elle rencontre l'espace.

Exemple :
Code :
1
2
3
for i in `find . -name "*.txt"`
        do mv $i `echo $i | sed "/txt/s//doc/"`
done
résultat :

mv: ne peut évaluer `./test': Aucun fichier ou répertoire de ce type
mv: ne peut évaluer `01.txt': Aucun fichier ou répertoire de ce type


comment faire comprendre à "find" que c'est un seul et même fichier qu'il faut traiter ? j'ai parcouru le man mais, je l'avoue, sans grand résultat...

Autre chose, en dehors d'une boucle "for", le résultat du "find" est correct...

./test 01.txt

avec une boucle "for" :

Code :
1
2
3
for i in `find . -name "*.txt"`
do echo $i
done
résultat :

./test
01.txt


Quelqu'un peut-il éclairer ma lanterne ?
Charly94 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 17h28   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 546
Points : 7 546
Le problème ne vient pas de find mais de for.
for utilise le séparateur par défaut pour identifier les noms de fichier dans la liste.
Ce séparateur est défini par la variable IFS, qui par défaut contient un espace.
En redéfinissant le séparateur, tu pourras récupérer tes noms de fichiers, sans tenir compte des espaces.
Tous tes noms de fichiers commençant par ., tu peux faire :
Code :
1
2
3
4
IFS=' ./'
for i in $(find . -name "*.txt")
   do mv ${IFS}$i $(echo ${IFS}$i | sed "/txt/s//doc/")
done
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 17h51   #3
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
Je me permet de rajouter une petite "amélioration" qui ne tiens pas compte du fait que la recherche se fait à partir du répertoire " . "

Code :
1
2
3
4
5
6
 
IFS=$'\n' 
for fichier in ( find / -name ".*brol" ) 
 do 
   TRAITEMENT
done
becket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 18h17   #4
Membre du Club
 
Inscription : février 2006
Messages : 55
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 55
Points : 47
Points : 47
Merci pour ces réponses rapides

Probleme résolu, un petit peu à ma sauce...mais grace à vous.

En fait, je declare la variable de cette façon IFS="" (donc null) et j'execute ma commande citée plus haut, et çà fonctionne.

ps pour becket : le but n'est pas de travailler sur l'ensemble des fichiers du systeme.
Charly94 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h18.


 
 
 
 
Partenaires

Hébergement Web