IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

script modifiant le nom des fichiers ET leurs chemins relatifs dans .htm


Sujet :

Linux

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut script modifiant le nom des fichiers ET leurs chemins relatifs dans .htm
    bonjour ou bonsoir à tous,
    voila, je viens de créer un serveur apache à partir de site recupéré sur un serveur mac ou les webmasters ne faisait pas attention à la casse puisque comme windows, ce serveur ne l'est pas. Le probleme est que ce n'est pas le cas sous linux !!!
    je dois donc modifier tous les noms de fichiers en minuscule ainsi que leurs chemins relatifs dans les fichiers .htm , .php et .html.
    J'ai donc commencé à faire un script lequel je n'arrives pas à boucler et je dois rendre mon rapport de stage dans trois jours!!!!
    Please help me.

    voici le script:
    #modifie les chemin relatif majuscule/minuscule en minuscule
    fawk() {
    for v in `cat /basename` ; do (
    for x in `cat /listhtm` ; do (
    if [[ -f `echo $x` ]]; then
    z=`ftr`
    cat $x | sed 's/'$v'/'$z'/g' > /TEMP/temp$x && rm -rf ./$x && mv /TEMP/temp$x ./$x && rm-rf /TEMP/*
    echo $v && echo $x && echo $z
    fi )
    done )
    done
    rm -rf /list /listbis /listhtm
    }

    #modifie les majuscules en minuscules
    ftr() {
    echo "ftr_fonctionne"
    echo $v|tr 'A-Z' 'a-z'
    }

    #liste les noms de fichiers dans le répertoire courant en excluant les dossiers
    list() {
    echo list_marche!!!
    ls > /list
    for u in `cat /list` ; do
    (if [[ -f `echo $u` ]]; then
    echo $u >> /listbis
    fi)
    done
    cat /listbis | grep htm > /listhtm
    }

    #placement dans le repertoire de travail
    cd $*

    #création d'un répertoire temporaire
    mkdir /TEMP

    #génération de la liste de nom de fichier nécéssaire à la fonction awk
    ls -R $* | grep -v / > /basename && sed -i '/^$/d' /basename

    #génération de la liste de dossier à visiter (déplacement dans les répertoires)
    ls -R $* | grep / | tr -d : > /dirname
    sort -r /dirname > /dirnamebis
    cat /dirname
    cat /dirnamebis
    for d in `cat /dirnamebis` ; do
    (if [[ -d `echo $d` ]] ; then
    cd $d && fawk
    fi)
    done

    for i in `ls -R` ; do
    j=`echo $i|tr 'A-Z' 'a-z'`
    mv "$i" "$j"
    done

    rm -rf /dirnamebis
    rm -rf /basename
    rm -rf /dirname
    rm -rf /TEMP



    quelqu'un peut il m'aider?

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut
    il est peut etre un peu tard.... je vais voir morphée et je passerai demain. good night

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    Bonjour patomicho,

    Tu peux essayer ainsi
    - pour renommer les fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ton_Repertoire | tac | xargs rename 'y/A-Z/a-z/'
    ...
    ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    find testwww
    testwww
    testwww/abc
    testwww/abc/zYf.php
    testwww/abc/KlM.htm
    testwww/abc/zYf.htm
    testwww/abc/KlM.html
    testwww/abc/KlM.php
    testwww/abc/zYf.html
    testwww/def
    testwww/def/zYf.php
    testwww/def/KlM.htm
    testwww/def/zYf.htm
    testwww/def/KlM.html
    testwww/def/KlM.php
    testwww/def/zYf.html
     
    find testwww | tac | xargs rename 'y/A-Z/a-z/'
     
    find testwww
    testwww
    testwww/abc
    testwww/abc/zyf.html
    testwww/abc/klm.htm
    testwww/abc/zyf.htm
    testwww/abc/klm.html
    testwww/abc/zyf.php
    testwww/abc/klm.php
    testwww/def
    testwww/def/zyf.html
    testwww/def/klm.htm
    testwww/def/zyf.htm
    testwww/def/klm.html
    testwww/def/zyf.php
    testwww/def/klm.php
    puis,
    - pour mettre en minuscules les chemins dans les liens des pages :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ton_Repertoire -type f -iname "*.php" -o -iname "*.htm" -o -iname "*.html" -exec sed 's/href="\([^"]*\)/href="\L\1/' {} \;
    ...
    ?

    NB : prend quand même soin d'effectuer une sauvegarde du site!
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut detail des sequences
    Bonjour, me revoila.

    Merci N_BaH pour tes remarques, c'est la premiére fois que je poste et tu es le premier qui me repond. Ca donne envie de coder! Le temps de me prendre un petit café et je m'y remet.
    Je vais essayer d'insérer tes propositions au codes.
    En ce qui concerne ce que j'ai fait ( et vais devoir modifier!!!) ,, le but est, dans l'ordre, de :
    - recueillir les "basename" de chaques fichiers dans l'arborescence,
    - les stocher dans un fichier "basename" à des fins de reinsertion dans une boucle for qui modifiera les chemins relatifs des fichiers .htm aprés avoir été "miniscularisé par la commande tr 'A-Z' 'a-z'
    - puis renommer au final les noms des fichiers en minuscules.
    D'écrire ces quelques lignes me fait dejà trouver des idées...
    En fait, il s'agit que je trouve le bon séquençage d'action et peut etre inséré quelques "break".
    A suivre....

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut PS pour N_BaH
    En ce qui concerne l sauvegarde du site, je travaille par sur le site lui-meme. je me suis fait une plateforme de test avec des fichiers bidons lesquelles regroupe toutes les difficultés que je pourrait rencontrer.
    Merci du conseil.
    Je suis bien content de ne pas etre seul au monde. ça motive.!!!

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    Aïe, aïe, aïe... Ce que je t'ai proposé, en fait, ne fonctionne pas !

    Cela n'a pu fonctionner que parce que j'avais déjà fait des essais sans reconstruire la structure des répertoires qui devaient également contenir des majuscules, mais, je m'en aperçois en me relisant, n'en contiennent plus.

    désolé
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut
    J'ai pas encore eu l'occasion de tester tes commandes parce que je dois absolument rédiger mon rapport pour dans deux jours!!!
    Toutefois tes commandes pourront peut etre me servir en les insérant dans le prochain script... je vais tout reprendre de zero. Ca me démange d'ailleurs, je déteste les rapports, c'est dur de pas me remettre à coder.
    En tous cas merci pour ton attention.

    Je donnerais des nouvelles dés que je m'y remettrai et vous tiendrez au courant.

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    Reste concentré sur la rédaction de ton rapport.

    Pour le script, surtout, oublie l'idée d'utiliser des fonctions, une seule, récurrente, appelée dans le script d'une quinzaine de lignes, fera ce qu'il faut, au moins pour le renommage... (on peut faire un script qui (re)génère autant de niveau(x) de répertoires que nécessaire (ou inclure une fonction qui s'en charge) mais on dépasserait les quinze lignes...).
    Je pensais pouvoir faire mieux que ce qui existait déjà, et j'avais tort, (pour l'instant...)

    quant aux liens, ils peuvent être sur plusieurs lignes, et alors la ligne que j'ai donnée, ne sera pas, non plus, correcte...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut
    Je vois que mon exercice t'intéresse particuliérement, non seulement ça me fait plaisir, mais ça me donne envie de chercher aussi.
    Je rend mon rapport demain midi. Je dois préparer l'oral pour le treize octobre (j'ai juste à faire un pps). De ce fait, je consacrerais ma journée de jeudi voir plus (j'ai honte de te voir chercher tous seul)
    J'ai pas trés bien compris ce que tu veux dire en ce qui concerne la (re)génération de repertoire.
    En ce qui concerne le nombre de fonction, tu as surement pas tort, en plus toutes ces boucles for imbriquées me donne le tourni!!!!
    A bientôt

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    J'ai pas trés bien compris ce que tu veux dire en ce qui concerne la (re)génération de repertoire.
    Pour ne plus commettre le même type d'erreur, je recrée le répertoire de test chaque fois que le script est lancé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    \rm -R testwww
    mkdir testwww
    touch testwww/{KlM,xYz}.{php,htm,html}
    mkdir testwww/{aBc,DeF}
    touch testwww/{aBc,DeF}/{KlM,xYz}.{php,htm,html}
    mkdir testwww/{aBc,DeF}/{nOp,QrS}
    touch testwww/{aBc,DeF}/{nOp,QrS}/{KlM,xYz}.{php,htm,html}
    comme ça, plus de fausses joies
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut
    Oui, c'est ûr c'est mieux.
    Si tu trouves la solution, laisse moi languir un peu. J'aimerais en trouver une par moi-même. On pourra toujours comparer nos resultats apré.
    A plus

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut De retour avec une intrigue pouvant tout simplifié
    Je suis en train de reeflechir sur le sujet et je me posais une question:

    Dan la fonction :

    for i in `cat /basename` ; do
    v=`echo $i | tr 'A-Z' 'a-z'`
    cat /fichier | sed 's/'$i'/'$v'/g' >> /temp
    sleep 10
    mv /temp /fichier
    done

    Le but de la fonction est de modifier dan le fichier tous les mots contenus dans /basename par leur equivalent en minuscule.
    Ce que j'aimerais savoir: est il possible d'obtenir le même résultat sans passer par un fichier temporaire?

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut suivi
    En ce qui concerne la modification des chemins relatifs, je garderai la fonction suivante:

    mkdir /temp
    for i in `cat ./basename` ; do
    v=`echo $i | tr 'A-Z' 'a-z'`
    cat ./fichierr | sed 's/'$i'/'$v'/g' > /temp/temp
    mv /temp/temp ./fichierr
    done
    rm -rf /temp


    maintenant je cherche à creer une fonction générant une une expression réguliére dynamique en fonction des différents nom de fichiers présents dans le fichier basename.
    Des sugestions?

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut précision
    la fonction désirée:
    for i in `cat /basename`; do
    [création de l'expression régulière] >> /regex
    done

  15. #15
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    est il possible d'obtenir le même résultat sans passer par un fichier temporaire?
    oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/'$i'/'$v'/g' /fichier
    Tu risques d'avoir de mauvaises surprises si tu lis tes fichiers avec for, il faut préférer utiliser une boucle while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read nomFic; do
       v=$(tr 'A-Z' 'a-z' <<<"$nomFic") #cf. herestring
       sed -i 's/'"$i"'/'"$v"'/g' ./fichierr #-i pour 'in-situ'
    done < ./basename
    On peut encore "simplifier", si tu utilises GNU sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read nomFic; do
    sed -i 's/\('"$nomFic"'\)/\L\1/' ./fichierr #\L pour lowercase
    done < ./basename
    m'enfin tout cela me parait toujours trop tarabiscotté.

    Je te donnes ma version ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #!/bin/bash
     
    #set -x
     
    DIR=testwww
     
    createFiles() {
    for i in $1/*; do
       [ -d $i ] && {
          touch $i/{KlM,xYz}.{php,htm,html}
          createFiles $i
       }
    done
    }
     
     
     
     
     
    downCase() {
    for item in $1/*
     do
      mod="$(sed 's@\(.*/\)\(.*\)@\1\L\2@' <<<"$item")"
       if [ -d "$item" ]
        then
          mv "$item" "$mod"
          downCase "$mod"
        else
          sed 's/href="\([^"]*\)/href="\L\1/' "$item" 
          mv "$item" "$mod"
       fi
    done
    }
     
     
    clear
    [ -d $DIR ] && /bin/rm -R $DIR
    mkdir -p $DIR/{aBc,DeF,gHI}/{nOp,QrS,tUV}
    touch $DIR/{KlM,xYz}.{php,htm,html}
    createFiles $DIR
     
    find $DIR
    read -p ^[E'^[[01;31mAppuie sur "Entrée" pour voir le résultat^[[00m'
    clear
     
    echo -e "\n=-=-=-=-=-=-=-=\n$DIR est devenu :\n=-=-=-=-=-=-=-=\n"
     
    downCase $DIR
    find $DIR
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut respect
    Pour etre franc, là je suis impréssioné. Je prend note de tes remarques et vais devoir étudier un peu pour comprendre ton script. Il intègre des notions auquel je suis pas habitué, je vais devoir l'étudier un peu pour le comprendre.
    J'étais sur le point d'aller me coucher (trés dure journée!!!) quand je l'ai vu, copier coller et je vais l'étudier demain.
    Je prend note de ta remarque en ce qui concerne la boucle for et while. Je maitrise pas encore bien les différences entre celles-ci et vais reprendre mon bouquin pour combler cette lacune. En plus je suis en train d'apprendre les expressions régulières que je maîtrise pas encore.
    Pour être franc, n_bah, tu es le genre de personne qui motive à pratiquer un exercice. Ton aide m'est trés précieuse et j'espére avoir l'occasion de te rendre service.
    Merci.
    Je dois me reposer. Bonne nuit

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut
    Salut
    Je viens pour te demander un renseignement n_bah:
    Dans la commande sed, tu utilises @ et je n'arrive pas à comprendre pourquoi. Peux tu m'aider?

  18. #18
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    Bonjour patomicho,

    Dans la commande sed, tu utilises @ et je n'arrive pas à comprendre pourquoi.
    Pour que sed ne confonde pas ses séparateurs et les slashes des chemins sans avoir à protéger ces derniers. J'aurais pu écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mod="$(sed 's/\(.*\/\)\(.*\)/\1\L\2/' <<<"$item")"
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  19. #19
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 2
    Points
    2
    Par défaut
    j'ai trouvé. c'est un delimiteur... la commande sed me reserve telle encore d'autres surprises

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/10/2012, 01h18
  2. supprimer des fichiers selon leur nom
    Par qmike dans le forum VBScript
    Réponses: 3
    Dernier message: 12/06/2012, 09h28
  3. Recherche des fichiers par leurs noms
    Par hackoofr dans le forum Vos Contributions VBScript
    Réponses: 0
    Dernier message: 26/05/2011, 12h08
  4. Réponses: 2
    Dernier message: 18/02/2010, 10h30
  5. Lire des fichiers selon leur nom
    Par guiguilelotois dans le forum LabVIEW
    Réponses: 4
    Dernier message: 18/05/2009, 13h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo