OVH Cloud OVH Cloud

[FILES]Rechercher et pemplacer

17 réponses
Avatar
mais_euh
salut,

je dois remplacer la chaine 'toto.php' par la chaine 'tit.php' dans un grand
nombre de fichiers *.php. Donc j'ai vu qu'il y a sed, find, replace, grep,
plein d'options, je me suis tout mélangé dans la tête. bon, je faire pause
et continuer à chercher. mais si l'un ou l'une d'entre vous à une solution
avec descente dans les répertoires et tout je suis preneur. Au départ je me
suis dit ça ira plus vite et là je raaaaÄaaame!

merci beaucoup!

@+

--
Plus tu sais, moins tu comprends.

10 réponses

1 2
Avatar
Emmanuel Florac
Le Mon, 18 Oct 2004 16:47:41 +0000, mais_euh a écrit :


merci beaucoup!


Pour sed c'est simple la syntaxe est :

sed 's/toto.php/tit.php/g'

Ensuite un coup de find du genre:

find . -name "*.php" -exec sed 's/toto.php/tit.php/g' {} ;

On peut améliorer en utilisant 'grep' pour ne traiter que les fichiers
contenant "toto.php" :

find . -name "*.php" -exec grep -l toto.php {} ; > liste.txt

ensuite

for i in `cat liste.txt` ; do sed 's/toto.php/tit.php/g' $i > $i.new ;
done

Dans les fichiers .new tu auras la version modifiée. Si tu veux remplacer
les originaux par les . new :

for i in `cat liste.txt` ; do mv $i.new $i ;
done







--
Je suis riche des biens dont je sais me passer.
Louis-Jean-Baptiste Etienne Vigée.

Avatar
TiChou
Dans le message <news:cl0l7u$4qm$,
*mais_euh* tapota sur f.c.o.l.configuration :

salut,


Bonjour,

je dois remplacer la chaine 'toto.php' par la chaine 'tit.php' dans un
grand nombre de fichiers *.php.


Avec un GNU sed récent :

find . -type f -name '*.php' -print0 |
xargs -r0 sed -i 's/toto.php/tit.php/g'

Avec zsh et un GNU sed récent :

sed -i 's/toto.php/tit.php/g' **/*.php(.D)

Ou enfin avec zsh et perl, la solution la plus avantageuse en terme de
ressources et de conservation des permissions :

perl -pi.bak -e 's/toto.php/tit.php/g' **/*.php(.D)

L'option '-i.bak' permettant de conserver une copie du fichier initial en
lui rajoutant l'extention '.bak'.

merci beaucoup!


De rien.

--
TiChou

Avatar
Rakotomandimby Mihamina
[Xpost+fu2 la buvette]

On Mon, 18 Oct 2004 18:02:19 +0200, TiChou wrote:

Avec zsh et un GNU sed récent :


Tiens Tichou s'est mit au zsh aussi ? :-)
Avec S Chazelas (de fcou) Seki, moi, ça fait de plus en plus d'adeptes
ça ...

--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)

Avatar
Rémi
mais_euh wrote:

salut,

je dois remplacer la chaine 'toto.php' par la chaine 'tit.php' dans un
grand nombre de fichiers *.php. Donc j'ai vu qu'il y a sed, find, replace,
grep, plein d'options, je me suis tout mélangé dans la tête. bon, je faire
pause et continuer à chercher. mais si l'un ou l'une d'entre vous à une
solution avec descente dans les répertoires et tout je suis preneur. Au
départ je me suis dit ça ira plus vite et là je raaaaÄaaame!

merci beaucoup!

@+

Il existe un logiciel graphique qui fait cela, il s'appel renamer,

mais je ne l'ai jamais testé. Un conseil, essaye le langage python
c'est largement, même très largement plus conviviale que tous
les scripts shell que tu pourrais produire avec perl, sed ou awk...

Avatar
Sebastien Kirche
Le 18 Oct 2004, Rakotomandimby Mihamina vraute :

[Xpost ignoré car je reste technique - mais possible de repartir vers fcou]

On Mon, 18 Oct 2004 18:02:19 +0200, TiChou wrote:

Avec zsh et un GNU sed récent :


Tiens Tichou s'est mit au zsh aussi ? :-)
Avec S Chazelas (de fcou) Seki, moi, ça fait de plus en plus d'adeptes
ça ...


Oui, mais moi j'avance (très) progressivement et je rame :)

Par exemple le globbing (c'est ça le terme ?) : **/*.php(.D) pour rechercher
récursivement des fichiers php.

Moi je serais parti vers */*.php je suppose qu'avec (.) on s'assure de
traiter des fichiers et pas autre chose (lien) mais le 'D' quel rapport avec
les répertoires ? Je suppose que je rate manifestement quelque chose.

Et ** =/= */ ?

J'ai même tenté une recherche web avant de poster ceci, mais 'zsh globbing'
est peu pertinent, visiblement. J'aurais voulu trouver la section du manuel
qui va bien.

Sébastien Kirche


Avatar
TiChou
Dans le message <news:,
*Sebastien Kirche* tapota sur f.c.o.l.configuration :

Salut Séb, :)

Par exemple le globbing (c'est ça le terme ?)


Oui.

: **/*.php(.D) pour rechercher récursivement des fichiers php.

Moi je serais parti vers **/*.php je suppose qu'avec (.) on s'assure
de traiter des fichiers et pas autre chose (lien)


Oui.

mais le 'D' quel rapport avec les répertoires ?


Ce n'est pas 'D' pour Directory mais 'D' pour Dot. :)
Ça permet de traiter aussi les fichiers commençant par un '.'.

Je suppose que je rate manifestement quelque chose.

Et ** =/= */ ?


Pas trop compris la formulatio de la question là. :)

**/ c'est pount indiquer de faire une recherche récursive.

J'ai même tenté une recherche web avant de poster ceci, mais 'zsh
globbing' est peu pertinent, visiblement. J'aurais voulu trouver la
section du manuel qui va bien.


man zshexpn

Section 'Glob Qualifiers' et, pour être plus large, la section 'FILENAME
GENERATION'.

--
TiChou

Avatar
Johan
Qu'est c e qu'il a de mieux que bash zsh???
Avatar
mais_euh
Selon Emmanuel Florac, il paraitrait que:
Pour sed c'est simple la syntaxe est :

sed 's/toto.php/tit.php/g'

Ensuite un coup de find du genre:

find . -name "*.php" -exec sed 's/toto.php/tit.php/g' {} ;

On peut améliorer en utilisant 'grep' pour ne traiter que les fichiers
contenant "toto.php" :

find . -name "*.php" -exec grep -l toto.php {} ; > liste.txt

ensuite

for i in `cat liste.txt` ; do sed 's/toto.php/tit.php/g' $i > $i.new ;
done

Dans les fichiers .new tu auras la version modifiée. Si tu veux remplacer
les originaux par les . new :

for i in `cat liste.txt` ; do mv $i.new $i ;
done
eh bien, merci beaucoup à tous!! j'aurais eu un peu de chemin à parcourir

quand même sans votre aide!!
merci beaucoup
--
Plus tu sais, moins tu comprends.

Avatar
TiChou
Dans le message <news:cl141p$6jn$,
*Johan* tapota sur f.c.o.l.configuration :

Qu'est c e qu'il a de mieux que bash zsh???


Je vous invite à poser cette question sur fr.comp.os.unix où Stephane
CHAZELAS se fera sûrement un plaisir d'énumérer tous les points forts du
shell zsh.
Vous pouvez aussi consulter les archives du groupe :

http://www.google.fr/groups?q=zsh+group:fr.comp.os.unix+author:"Stephane+CHAZELAS"&scoring=d

--
TiChou

Avatar
Sebastien Kirche
Le 18 oct 2004, TiChou vraute :

Et ** =/= */ ?


Pas trop compris la formulatio de la question là. :)


Heu, certes :) Lire «** n'est pas égal à */ ?»


**/ c'est pount indiquer de faire une recherche récursive.


Y a-t-il une différence avec une simple * ?

Par exemple chez moi un «rm .etwolf/*/*.tmp» depuis ~/ va me chercher comme
un grand les .tmp dans ~/.etwolf/etmain/ et ~/.etwolf/etpro/...
C'est bien récursif aussi ?
Ou ça marche parce que je n'ai qu'un niveau de répertoire ?

J'ai même tenté une recherche web avant de poster ceci, mais 'zsh
globbing' est peu pertinent, visiblement. J'aurais voulu trouver la
section du manuel qui va bien.


man zshexpn

Section 'Glob Qualifiers' et, pour être plus large, la section
FILENAME GENERATION'.


Arf, merci Tichou.

Je suis visiblement plus performant en Google qu'en man. Et encore moins en
info. Or sur Google il est quelque peu ardu de chercher des étoiles :)

Sébastien Kirche


1 2