OVH Cloud OVH Cloud

Script bash

11 réponses
Avatar
Jean-Marie Delapierre
Bonjour,

Il y a quelques temps, un contributeur du Ng avait posé la question du
remplacement de terminaisons de noms de fichiers (du genre : remplacer
*.doc par *.rtf).

Naivement, j'avais proposé un script du genre :

#!/bin/bash

for i in $(ls *.doc)
do mv $i $(echo $i|sed -e s/.doc/.rtf/)
done

et je m'étais fait fort justement reprendre de volée à la raison (entre
autres) que ce script ne marche pas si les noms de fichiers comportent des
espaces. Puis l'un des contributeurs avait proposé un script extrèmement
propre et concis que j'aimerais bien retrouver. Une recherche sur les
archives n'ayant rien donné, quelqu'un peut-il me rappeler comment
réaliser proprement cette tâche ?

Cordialement.

Jean-Marie

10 réponses

1 2
Avatar
Calimero
Jean-Marie Delapierre wrote:
quelqu'un peut-il me rappeler comment
réaliser proprement cette tâche ?


groups.google.com ?

--
@+
Calimero

Avatar
lhabert
Jean-Marie Delapierre :

for i in $(ls *.doc)
do mv $i $(echo $i|sed -e s/.doc/.rtf/)
done

et je m'étais fait fort justement reprendre de volée à la raison (entre
autres) que ce script ne marche pas si les noms de fichiers comportent des
espaces.


Et des *, et des [, et un « doc » non final (sauf en début de ligne).

Puis l'un des contributeurs avait proposé un script extrèmement propre et
concis que j'aimerais bien retrouver. Une recherche sur les archives
n'ayant rien donné, quelqu'un peut-il me rappeler comment réaliser
proprement cette tâche ?


mv -- "$i" "${i%doc}"rtf

Avatar
Jean-Marie Delapierre
Le Sat, 18 Feb 2006 11:35:34 +0000, Luc Habert a écrit :

Jean-Marie Delapierre :

for i in $(ls *.doc)
do mv $i $(echo $i|sed -e s/.doc/.rtf/)
done

et je m'étais fait fort justement reprendre de volée à la raison (entre
autres) que ce script ne marche pas si les noms de fichiers comportent des
espaces.


Et des *, et des [, et un « doc » non final (sauf en début de ligne).

Puis l'un des contributeurs avait proposé un script extrèmement propre et
concis que j'aimerais bien retrouver. Une recherche sur les archives
n'ayant rien donné, quelqu'un peut-il me rappeler comment réaliser
proprement cette tâche ?


mv -- "$i" "${i%doc}"rtf


Merci de ta contribution.
Cependant, cela ne règle pas le problème des noms de fichiers contenant
des espaces.

Cordialement.

Jean-Marie


Avatar
Jean-Marie Delapierre
Le Sat, 18 Feb 2006 12:34:41 +0100, Calimero a écrit :

Jean-Marie Delapierre wrote:
quelqu'un peut-il me rappeler comment
réaliser proprement cette tâche ?


groups.google.com ?


????

Quand j'ai écrit qu'une recherche sur les archives n'avait rien donné,
cela voulait dire sur groups.google.com.

Cordialement.

Jean-Marie


Avatar
lhabert
Jean-Marie Delapierre :

mv -- "$i" "${i%doc}"rtf


Merci de ta contribution.
Cependant, cela ne règle pas le problème des noms de fichiers contenant
des espaces.


Bein si.


Avatar
Matthieu Moy
Jean-Marie Delapierre writes:

Jean-Marie Delapierre :

for i in $(ls *.doc)
^^^^^^^^^^^




Useless use of ls !

Quand to shell execute ça, la première chose qu'il fait, c'est
d'expanser le « * », et de le transformer par exemple en
"fichier1.doc" "fichier2.doc" "fichier avec espace.doc". C'est à dire
que ton shell fait juste ce qu'il faut.

Après, il execute ls, qui transforme ça en
"fichier1.doc
fichier2.doc
fichier avec espace.doc
"

(note : avec $(echo *.doc), tu aurais le même résultat. La commande
"ls" ne fait quasiment rien ici).

et après, il fait l'interpretation des blancs, donc il découpe ça en

fichier1.doc
fichier2.doc
fichier
avec
espace.doc

et passe dans la boucle for pour chacun.

La version correcte est simplement

for i in *.doc

Cependant, cela ne règle pas le problème des noms de fichiers contenant
des espaces.


Ca merdait à deux endroits, Luc n'en a corrigé qu'un ;-).

Au passage, pour renomer une série de fichiers, il y a "rename" qui
est fourni en général avec perl :

rename 's/.doc$/.rtf/' *.doc

--
Matthieu



Avatar
lhabert
Matthieu Moy :

Ca merdait à deux endroits, Luc n'en a corrigé qu'un ;-).


Ah oui, j'avais survolé le for, j'imaginais pas qu'il soit possible de
mettre autre chose que « *.doc » à cet endroit là...

Avatar
lhabert
Matthieu Moy :

Ca merdait à deux endroits, Luc n'en a corrigé qu'un ;-).


Ah oui, j'avais survolé le for, j'imaginais pas qu'il soit humainement
possible de mettre autre chose que « *.doc » à cet endroit là...

Avatar
Jean-Marie Delapierre
Le Sat, 18 Feb 2006 14:13:04 +0000, Luc Habert a écrit :

Matthieu Moy :

Ca merdait à deux endroits, Luc n'en a corrigé qu'un ;-).


Ah oui, j'avais survolé le for, j'imaginais pas qu'il soit humainement
possible de mettre autre chose que « *.doc » à cet endroit là...


Bonsoir,

Merci à vous deux.
Cependant, ce que je n'arrive pas à retrouver est une syntaxe très
différente pour réaliser ce traitement.

Cordialement.


Avatar
Matthieu Moy
Jean-Marie Delapierre writes:

Bonsoir,

Merci à vous deux.
Cependant, ce que je n'arrive pas à retrouver est une syntaxe très
différente pour réaliser ce traitement.


http://groups.google.com/group/fr.comp.os.linux.configuration/browse_frm/thread/38dd23807040d19d/74561df83599d309

?

--
Matthieu

1 2