Bienvenue visiteur (Inscription |  Connexion)
Qui est en ligne ?
Il y a : 15 utilisateurs en ligne, consultez le détail
Auteur Message
clahor
#0 Message posté le : 05-11-2007 à 14:18:09


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 24-04-2005
Nombre de messages : 136
bjr comme je suis curieux de tout j'ai une petite question sur la commande rename

rename 's/ //g' *.machin


la commande suivante permet d'eliminer les espaces des noms de fichiers ayant pour extension machin

je ne vois pas les options s , g dans le man de rename??quelqu'un pourrait il m'expliquer ????

je suppose que / // veut dire remplacer un espace / / par rien //

merci d'avance

--Message édité par clahor le 07-11-2007 à 18:18:20--
tamiel
#1 Message posté le : 05-11-2007 à 15:13:57


Hobbit


Forum : Inscrit
Association :
Arrivé(e) le : 17-10-2003
Nombre de messages : 1067
Il me semble qu'il ya plusieurs versions de "rename", une qui supporte ce genre d'expressions et une autre pas.

Dans mon man rename, j'ai bien un exemple de ce type.

Voici ma version :
rename from util-linux-2.12a

--Message édité par tamiel le 05-11-2007 à 15:14:10--


-------------------------------------
If you don't know, ask manpage !
doobs
#2 Message posté le : 05-11-2007 à 15:56:35


Hobbit


Forum : Modérateur
Association : Membre actif
Arrivé(e) le : 11-08-2003
Nombre de messages : 1530
Salut,

's/ //g' est une expression régulière que tu peux utiliser autre part que dans rename.

-------------------------------------
clahor
#3 Message posté le : 05-11-2007 à 17:52:03


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 24-04-2005
Nombre de messages : 136
merci a vous et l'expression reguliere
s/ //g 
signifie (remplacer espace par rien ) je suppose.....j'ai trouvé la un aperçu de la syntaxe en question

http://pwet.fr/blog/tags/shell/(offset)/20


Remplacer du texte dans une série de fichiers répartis dans des dossiers



Le remplacement d'une chaîne par un autre dans une série de fichiers textuels de manière récursive (dans différents dossiers à différentes profondeurs) est une question qui revient souvent sur les listes de diffusion comme celle de Ubuntu-fr ou sur les forums comme par ce message de Free Mind d'il y a à peine 2 heures. Et pourtant la solution est "relativement" simple et tient en une ligne dans un terminal.



find /dossier/contenant/fichiers -type f -exec sed -i 's/à remplacer/remplacement/g' {} \;



Petite explication :

Cette commande indique à find de trouver dans /dossier/content/fichiers tous les fichiers simples (pas les dossiers, ni les liens symboliques, ...) et de lancer le remplacement avec sed (Stream EDitor). Dans cette expression, -i indique à sed de faire le remplacement directement dans le fichier plutôt que d'afficher la sortie. {} indique à find ou mettre le nom du fichier dans la commande, enfin le ; indique à find la fin de la commande à lancer et ce point virgule doit être précédé d'un \ (anti-slash) pour éviter qu'il ne soit interprèté par le shell.



Cette ligne montre toute la puissance qu'offre la combinaison des utilitaires en ligne de commandes disponible sous GNU/Linux (et sous la plupart des Unix) et en particulier de find et sed . En particulier la lecture de la page du manuel de find est plus que recommandé pour quelqu'un qui désire écrire des scripts shell de manipulation de fichiers.



Publié le 1 Septembre 2006 à 20:39 - 1 commentaire(s) - 0 trackback(s)



Tags : bash, Ubuntu, Linux, shell


--Message édité par clahor le 05-11-2007 à 18:09:19--
jblecanard
#4 Message posté le : 06-11-2007 à 10:54:49


Jedi


Forum : Modérateur
Association : Membre fondateur
Arrivé(e) le : 08-01-2005
Nombre de messages : 4030
Tout à fait, je complèterai même en disant que :

- "s" signifie "substitute" soit remplacer en anglais. Il y a d'autres commandes que "s".
- L'expression régulière recherchée se trouve entre les deux premiers "/", ici un espace.
- Le motif de remplacement se trouve entre les deux derniers "/", soit rien ici.
- Le "g" signifie "global" mais je ne sais plus trop ce que ça veut dire. ça a trait à la recherche de du motif.

Tu peux te renseigner sur la commande sed, qui fait la même chose mais sur les lignes d'un fichier et non sur son nom. Tu trouveras plus facilement de doc sur sed que sur rename, notamment vis à vis des expressions rationnelles .

-------------------------------------
C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon -
clahor
#5 Message posté le : 06-11-2007 à 12:57:53


Scarabée


Forum : Inscrit
Association :
Arrivé(e) le : 24-04-2005
Nombre de messages : 136
merci a tous pour ces precieux renseignements qlq lignes de bash de temps a temps peuvent rendre des services )
tamiel
#6 Message posté le : 06-11-2007 à 13:28:03


Hobbit


Forum : Inscrit
Association :
Arrivé(e) le : 17-10-2003
Nombre de messages : 1067
le g à la fin veut tout simplement dire "pour tous les motifs trouvés" (matching regexp) .

-------------------------------------
If you don't know, ask manpage !
Azollyx
#7 Message posté le : 09-11-2007 à 14:33:00


Naboo


Forum : Modérateur
Association : Président
Arrivé(e) le : 09-04-2006
Nombre de messages : 2077
Je ne sais pas si rename le prend en charge mais il est à noter que vous pouver utiliser n'impore quel charactére comme séparateur. Cela peut-être pratique quand les chaînes contiennent des barres obliques. Par exemple : 's@http://www.ymer.info/@http://www.azollyx.eu/@', sinon il faudrait protéger les / par des \ (http:\/\/...) et c'est parfois lourd.

--Message édité par Azollyx le 09-11-2007 à 14:34:14--


-------------------------------------
toto