Casse tête

Résolu
le dard -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour,

Je cherche à changer une expression commune dans plusieurs fichiers d'un même répertoire.
Le répertoire se nome /courrier/ et les fichiers n'ont pas d'extension (ce sont des fichiers textes nommés; gerard, anais, paul, tonton .. etc..)

Quelqu'un pourrait-il me commenter (décortiquer) la commande suivante afin que je ne fasse pas de bêtise:

vim -c '%s/toto/tata/g' -c 'wq!' *.ext

Merci d'avance pour votre aide. Pour vous ce sera peut-être de la rigolade, pour moi, je découvre, alors merci de votre indulgence.
Le dard

7 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Si ton répertoire contiens que des fichiers texte
    L'option -i.orig permet de sauvegarder les fichiers originaux avec l'extension .orig.
    La modification se fera sur place

    Dans un terminal tape
    sed -i.orig 's/toto/tata/g' /chemin/vers/courrier/*
    0
    1. le dard
       
      Bonjour

      Merci Lami, tu m'as enlevé une bonne épine du pied ce qui m'a fait gagné du temps.
      Juste une précision: A la suite de cela, je me suis retrouvé avec un fichier en doublon qui lui se terminait par l'extension .orig et comme j'ai fait plusieurs fois la manip pour remplacer d'autres chaines de caractères, il a créé des .orig.orig.orig etc.. autant de fichiers que j'ai fait de manips.
      Bon ce n'est pas grave car j'ai fait un rm *.orig et le pb a été réglé..

      J'ai une question maintenant similaire à poser:

      J'ai un répertoire avec des sous-répertoires qui contiennent chacuns des fichiers.html dans lesquels je voudrai modifier une chaine de caractères. Comment dois-je modifier la commande

      sed -i.orig 's/toto/tata/g' /chemin/vers/courrier/*

      Merci d'avance pour toute réponse

      Le Dard
      0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,
    $ find /home/lami20j/trash/dard -type f -name '*.html' -print -exec cat {} \;
    /home/lami20j/trash/dard/c/fic.html
    toto
    /home/lami20j/trash/dard/c/fic3.html
    toto
    /home/lami20j/trash/dard/b/fic2.html
    toto
    /home/lami20j/trash/dard/b/fic.html
    toto
    /home/lami20j/trash/dard/a/fic4.html
    toto
    /home/lami20j/trash/dard/a/fic.html
    toto
    $ find /home/lami20j/trash/dard -type f -name '*.html' -exec sed -i.orig 's/toto/tata/' {} \;
    $ find /home/lami20j/trash/dard -type f -name '*.html' -print -exec cat {} \;
    /home/lami20j/trash/dard/c/fic.html
    tata
    /home/lami20j/trash/dard/c/fic3.html
    tata
    /home/lami20j/trash/dard/b/fic2.html
    tata
    /home/lami20j/trash/dard/b/fic.html
    tata
    /home/lami20j/trash/dard/a/fic4.html
    tata
    /home/lami20j/trash/dard/a/fic.html
    tata
    $ find /home/lami20j/trash/dard -type f -name '*.html.orig' -print -exec cat {} \;
    /home/lami20j/trash/dard/c/fic3.html.orig
    toto
    /home/lami20j/trash/dard/c/fic.html.orig
    toto
    /home/lami20j/trash/dard/b/fic2.html.orig
    toto
    /home/lami20j/trash/dard/b/fic.html.orig
    toto
    /home/lami20j/trash/dard/a/fic.html.orig
    toto
    /home/lami20j/trash/dard/a/fic4.html.orig
    toto
    
    0
    1. le dard
       
      Bonsoir Lami,

      Houlà c'est un peu compliqué pour moi te serait-il possible sans vouloir te prendre ton temps de me réécrire ta manip avec le nom de mes fichiers:

      Le répertoire principal se nomme: Boutique
      Les sous répertoires se nomment respectivement: rayon1, rayon2 et rayon3 etc...
      les fichiers se nomment respectivement tous : index.htm

      Merci d'avance car je suis bien loin d'être un crac en la matière; je comprends vite mais faut m'expliquer lentement :=)
      0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    find /chemin/Boutique -name '*index.htm' -exec sed -i.orig 's/toto/tata/' {} \;

    0
    1. le dard
       
      SUper MERCI !!!!
      ça roule !
      0
    2. le dard
       
      Bonjour

      Les réponses ci-dessus ont apporté une réelle solution à mes interrogations: merci lami..
      Cependant, Je relance mon casse tête avec une demande similaire.. au risque de passer pour un nul de chez nul (ce que je suis pour l'instant je l'avoue). 2 Manip me seraient grandement utiles:

      1/- je suis donc avec la configuration de fichiers suivante:

      Le répertoire principal se nomme: Boutique
      Les sous répertoires se nomment respectivement: rayon1, rayon2 et rayon3 etc...
      les fichiers se nomment respectivement tous cette fois : images_nourriture.jpg

      Je souhaiterai renommer ces fichiers images_nourriture.jpg en image1.jpg


      2/- je reviens sur ma configuration de base:
      Le répertoire principal se nomme: Boutique
      Les sous répertoires se nomment respectivement: rayon1, rayon2 et rayon3 etc...
      les fichiers se nomment respectivement tous : index.htm

      je souhaite supprimer une expression commune à tous ces fichiers sans la remplacer


      Merci de vos lumières et pour le temps que je vous prends, j'en suis conscient
      C'est tellement super de pouvoir se faire aider de la sorte.. je n'en reviens toujours pas !
      afin de ne pas voler votre temps, j'ai quand même essayé de trouver une explication qui existerait déjà mais la seule que j'ai trouvée je ne sais pas l'interpréter car c'est pour des matheux entre eux !!
      Alors lami, je viens une nouvelle fois appeler à l'aide..
      0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Une possibilité.

    J'ai mis cp puisque je n'ai pas un environnement de test.
    Comme ça tu ne risque pas de perdre les fichiers.
    Pareil pour l'option i pour ne pas écraser un fichier existant.

    Si tous vas bien tu peux remplacer cp -vi avec mv -v

    for i in $(find /chemin/Boutique  -name '*images_nourriture.jpg');do cp -iv $i dirname($i)/image1.jpg;done 

    Mais je ne comprends pas.
    Tu as plusieurs fichiers avec le même nom dans plusierus répertoires? C'est bien ça?
    0
    1. le dard
       
      Re,

      Oui , dans différents répertoires, j'ai un fichier qui porte le même nom, car c'est une méthode pour moi en lisant le nom du fichier de savoir de quoi il est question dans l'image

      J'espère que vous avez bien compris ma requête..
      Merci
      Le dard
      0
    2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > le dard
       
      Re,

      Regarde le message 9 ;-)
      0
    3. le dard
       
      lami,
      J'ai essayé cette commande selon ce que vous m'écrivez plus haut mais j'ai un message d'erreur. ai-je mal écrit ?

      for i in $(find boutique/ -name '*image_nourriture.jpg');do cp -iv $i dirname($i)/image1.jpg:done

      -bash: erreur de syntaxe près du jeton `(' inattendu

      dans ce pb, il s'agit de renommer des fichiers qui se situent dans différents répertoires et sous répertoire du dossier (répertoire)Boutique

      Merci
      0
    4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > le dard
       
      Il y a une erreur dans la syntaxe à ce niveau :
      do cp -iv $i dirname($i)/image1.jpg
      Il faut écrire :
      do cp -iv $i $(dirname $i)/image1.jpg
      lami20j l'avait d'ailleurs bien écrit là en-dessous ;-\
      0
    5. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Salut,

      Merci ;-))
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Voici la bonne commande
    $ for i in $(find Boutique  -name '*images_nourriture.jpg');do echo $i;done
    Boutique/c/images_nourriture.jpg
    Boutique/b/images_nourriture.jpg
    Boutique/a/images_nourriture.jpg
    $ for i in $(find Boutique  -name '*images_nourriture.jpg');do mv -v $i $(dirname $i)/image1.jpg;done
    `Boutique/c/images_nourriture.jpg' -> `Boutique/c/image1.jpg'
    `Boutique/b/images_nourriture.jpg' -> `Boutique/b/image1.jpg'
    `Boutique/a/images_nourriture.jpg' -> `Boutique/a/image1.jpg'
    $ for i in $(find Boutique  -name '*images_nourriture.jpg');do echo $i;done
    $ for i in $(find Boutique  -name '*image1.jpg');do echo $i;done
    Boutique/c/image1.jpg
    Boutique/b/image1.jpg
    Boutique/a/image1.jpg
    
    0
    1. ledard
       
      Merci lami20 et jipy,
      mon 1er pb est maintenant résolu; j'ai pu changer les noms des fichiers c'est Super !!!
      Gros MERCI

      Je vais essayer de régler le second pb, mais je le ferai à tête reposée ce soir pour l'heure, il y a un peu trop de chahut dans cette maison...
      @++
      0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    je souhaite supprimer une expression commune à tous ces fichiers sans la remplacer
    Quelle expression?!
    0
    1. le dard
       
      Re,
      il s'agit d'une expression descriptive du type "Poireaux de France" ou "Mandarines du Maroc"
      merci
      0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Je n'ai pas supprimé les lignes contenant l'expression puisque je ne sais pas ce que tes fichiers contiennent.
    Donc tu verras dans l'exemple qu'au lieu de tes expressions il n'y a plus rien.
    Toutefois les blancs resteront.
    $ find Boutique/ -name '*index.htm'
    Boutique/c/index.htm
    Boutique/b/index.htm
    Boutique/a/index.htm
    $ find Boutique/ -name '*index.htm' -print -exec cat {} \;
    Boutique/c/index.htm
    Poireaux de France
    Mandarines du Maroc
    bla bla
    Boutique/b/index.htm
    Mandarines du Maroc
    bla bla
    Boutique/a/index.htm
    Poireaux de France
    bla bla
    $ find Boutique/ -name '*index.htm' -exec sed -i.orightm 's/Poireaux de France\|Mandarines du Maroc//g' {} \;
    $ find Boutique/ -name '*index.htm' -print -exec cat {} \;
    Boutique/c/index.htm
    
    
    bla bla
    Boutique/b/index.htm
    
    bla bla
    Boutique/a/index.htm
    
    bla bla
    $ find Boutique/ -name '*index.htm.orig*' -print -exec cat {} \;
    Boutique/c/index.htm.orightm
    Poireaux de France
    Mandarines du Maroc
    bla bla
    Boutique/b/index.htm.orightm
    Mandarines du Maroc
    bla bla
    Boutique/a/index.htm.orightm
    Poireaux de France
    bla bla
    
    0