Forum Linux.général Modifier des fichiers en bloc

Posté par  .
Étiquettes : aucune
0
13
avr.
2005
En gros, j'ai 100 fichiers avec des liens en .htm ou .html, je veux tout renommer : les fichiers et les liens dans les fichiers.

Quelqu'un a une idée ?

Pour renommer les fichiers, j'ai :

ls -d *.htm | sed 's/\(.*\).htm$/mv "&" "\1.php"/' | sh

mais pour le contenu des fichiers, je trouve pas.

Merci d'avance
  • # rename

    Posté par  . Évalué à 2.

    pour renommer, je suppose que sed fonctionne (je connais pas sed), mais il y a aussi 'rename' qui fait ca plutot bien.

    Pour les liens, j'aurais surement fait en perl, mais je pense que c'est possible encore plus simplement en sed.
    un truc du genre:

    for i in *.htm; cat $i | sed -e 's/htm/php/g' > $i

    devrait pas etre loin de fonctionner...
    Sinon, google a également plein de solution pour ce problème.
    • [^] # Re: rename

      Posté par  (site web personnel) . Évalué à 1.

      et pour l'intérieur des fichiers, un machin a base de find, xargs et sed devrait faire l'affaire, genre
      find . -name "*.htm" |xargs perl -i.bak -p -e 's/searchstr/replacestr/g';

      pour ce que tu veux faire,
      find . -name "*.htm" | xargs -i {} sed 's/htm/html/g' {} > {}l
      devrait faire l'affaire, une fois les bugs enlevés.

      Sinon, il y a un un machin appelé "deep" qui est plus simple a utiliser, mais je retrouve plus l'url

      PS: tiens, on firait qu'il y a une version gnu de xargs qui connait -i, le xargs bsd n'a pas l'air de connaitre
    • [^] # NON NON ET NON!!! DANGER : cat $i | sed -e 's/htm/php/g' > $i

      Posté par  (site web personnel) . Évalué à 1.

      Il ne faut surtout jamais faire celà, car cat va lire le fichier (par morceau et tu peut jamais savoir combien) tandis que bash va t'écraser le fichier en question... Résultat tu te retrouve avec un fichier vide et t'a tout perdu...

      la bonne commande serais (en bash):
      for i in *.htm; do cat $i | sed -e 's/htm/php/g' > $i.new && mv -f $i.new $i; done

      Sinon y a moyen de faire pareil avec perl :
      for i in *.htm; do perl -pe "s/htm/php/g" -i $i; done
      • [^] # Re: NON NON ET NON!!! DANGER : cat $i | sed -e 's/htm/php/g' > $i

        Posté par  (site web personnel) . Évalué à 3.

        Sinon y a moyen de faire pareil avec perl :
        for i in *.htm; do perl -pe "s/htm/php/g" -i $i; done


        Ou la même chose en une seule commande :

        perl -pi -e 's/\.htm/.php/g' *.htm
      • [^] # ARRETEZ AVEC VOS CAT | SED

        Posté par  . Évalué à 2.

        Ca ne sert a rien si ce n'est à ajouter un fork+exec a chaque fois que vous passez dans la boucle.

        for i in *.htm; do sed -e 's/htm/php/g' $i > $i.new && mv -f $i.new $i; done

        Vous ne seriez pas du genre a faire un cat toto | more?
    • [^] # je confirme: NE SURTOUT PAS FAIRE CA !

      Posté par  . Évalué à 1.

      for i in *.htm; cat $i | sed -e 's/htm/php/g' > $i
      hum... voyons voir...
      je pense que cette ligne remplace toutes les occurences de la chaîne 'htm' par 'php',
      dans toutes les lignes, de tout le contenu de tous les fichiers *.htm
      ça m'a tout l'air d'être un beau "ratiboisage" en bon et dûe forme
      sans aucun changement des noms de fichier...

      par contre un


      for i in $(ls *.htm); do echo mv -i $i $(echo $i | sed -e 's/\.htm$/\.php/i') ; done


      "ne devrait pas être loin" de marcher (en fait ça marche :] )
      en supposant que les noms de fichier ne contiennent pas d'espace (je n'ai pas testé en fait, les espaces dans les noms de fichier sont une hérésie) et que l'on pipe le résultat dans un shell car on ne fait qu'afficher les commandes pour éviter les "catas". ( | /bin/sh )
      • [^] # je me réponds

        Posté par  . Évalué à 1.

        parce que j'ai omis quand même la modification du contenu des fichiers.
  • # rename

    Posté par  . Évalué à 1.

    rename 's/\.htm$/\.php/' *.htm

    et une petiti preuve:

    frbn@mx:~/test$ touch html.htm_htm.htm
    frbn@mx:~/test$ touch htmhtmhtm.htm.htm.htm
    frbn@mx:~/test$ ll
    total 0
    -rw-r--r-- 1 frbn frbn 0 Apr 14 08:35 htmhtmhtm.htm.htm.htm
    -rw-r--r-- 1 frbn frbn 0 Apr 14 08:35 html.htm_htm.htm
    frbn@mx:~/test$ rename 's/\.htm$/\.php/' *.htm
    frbn@mx:~/test$ ll
    total 0
    -rw-r--r-- 1 frbn frbn 0 Apr 14 08:35 htmhtmhtm.htm.htm.php
    -rw-r--r-- 1 frbn frbn 0 Apr 14 08:35 html.htm_htm.php



    the regexp paouwa

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.