[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: question sur 'sed' et 'tr', donc pas trop debian !



On Mon, 24 Jan 2000, Stéphane BERDIN wrote:

> Salut,
> 
> J'aimerai renommer tous les fichiers d'un répértoire, en fait, remplacer
> tous les " " par des "_".
> 
> voilà ce que je fais : for i in `find *` ; do mv $i `echo $i|tr " " "_"`;
> done

Sans être tout à fait sûr :
for i in `find *` ; do new_name=`echo "$i" | tr " " "_"` ; mv --
"$i" "$new_name"; done

> je me prends une erreur qui est :
> 
> "lors du déplacement de plusieurs fichiers, le dernier paramètres doit être
> un répertoire."
> "mv --help pour + d'infos"
> 
> une idée ?

Ca vient du fait que tu as des espaces dans $i. si i="a b",
mv $i `echo $i|tr " " "_"` devient mv a b a_b au lieu de mv "a b" a_b

Au lieu de ma version précédente, tu peux aussi faire :
for i in `find *` ; do mv "$i" `echo $i|tr " " "_"`; done
A condition que tu n'aies pas deux espaces à la suite dans ton nom de
fichier, ça suffit (mais ici "a  b" sera transformé en "a_b")

Le "--" après mv ne sert que si tu as des noms de fichiers commençant par
"-".

> Autre question : y a un frontend pour 'sed' ou/et 'tr' ? 

Un frontend ? Que veux-tu dire ? Emacs à la fonction query-replace-regexp
qui permet de confirmer chaque remplacement si c'est ça que tu cherches.

  Vincent

PS:
  Ton find avec for ne marche pas chez moi : il sépare les noms chaque
fois qu'il y a un espace (ce qui est normal). Avec les fichiers "a b" et
"c", j'ai : 
~$ for i in `find *` ; do echo "$i"; done
a
b
c

Il faut mieux :
~$ find * | while read i ; do echo "$i" ; done
a b
c



Reply to: