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

Shell et commandes POSIX Discussion :

[Bash] Remplacement de caractères [Solaris]


Sujet :

Shell et commandes POSIX

  1. #1
    Candidat au Club
    Homme Profil pro
    Stagière
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Stagière
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 4
    Points
    4
    Par défaut [Bash] Remplacement de caractères
    Bonjour

    Voici mon probleme :

    Je créer un script qui me liste tous les fichiers et dossiers de mon repertoire X "find ." et je les stock dans un fichier .
    J'ai donc des resultats stocké dans un fichier , du type :

    ./dossier1/dosssier2/fic.txt
    ./dossier1/dosssier2/fic.jpg

    Je voudrais remplacer chaque ligne par :

    nomfic;/opt/InfoVista/Portal/site/rubrics/help/dossier1/dosssier2/;no;555;

    Voila ce que j'ai éssayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
     
    find . >> list_fic.txt
     
    ligne=';no;555'
    std=/opt/InfoVista/Portal/site/rubrics/help/
     
     
    while read line  
    do 
            nomfic=${$line##\.*\/} // permet de virer tout entre le "." et la derniere / et ainsi recuperer que le nom du fichier
    	final=$std$nomfic$ligne
            echo  $final >> final.txt // je met dans final.txt la nouvelle ligne qui me va .
    done < list_fic.txt
    J'ai une erreur de bad substitution...

  2. #2
    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 392
    Points
    19 392
    Par défaut
    Bonjour,

    Citation Envoyé par Ekozium
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nomfic=${$line##\.*\/} // permet de virer tout entre le "." et la derniere / et ainsi recuperer que le nom du fichier
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    v="/mon/chemin/fichier.ext" # <-Commentaire
    v="${v%.*}"
    echo "${v##*/}"
    fichier
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Bonjour,
    Pas tout bien compris, car entre le script et le résultat voulu, il y a un décalage:
    Tu veux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nomfic;/opt/InfoVista/Portal/site/rubrics/help/dossier1/dosssier2/;no;555;
    mais dans ton echo tu retire le nomfic de départ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final=$std$nomfic$ligne
    Mais dans les 2 cas, find est suffisant, exemples:
    Contenu du répertoire source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ find .
    .
    ./dossier1
    ./dossier1/dosssier2
    ./dossier1/dosssier2/fic.jpg
    ./dossier1/dosssier2/fic.txt
    Le résultat final selon le script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ find . -printf "$std%P$ligne\n"
    /opt/InfoVista/Portal/site/rubrics/help/;no;555
    /opt/InfoVista/Portal/site/rubrics/help/dossier1;no;555
    /opt/InfoVista/Portal/site/rubrics/help/dossier1/dosssier2;no;555
    /opt/InfoVista/Portal/site/rubrics/help/dossier1/dosssier2/fic.jpg;no;555
    /opt/InfoVista/Portal/site/rubrics/help/dossier1/dosssier2/fic.txt;no;555
    Ici le find selon le résultat voulu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ find . -printf "%P;$std%P$ligne\n"
    ;/opt/InfoVista/Portal/site/rubrics/help/;no;555
    dossier1;/opt/InfoVista/Portal/site/rubrics/help/dossier1;no;555
    dossier1/dosssier2;/opt/InfoVista/Portal/site/rubrics/help/dossier1/dosssier2;no;555
    dossier1/dosssier2/fic.jpg;/opt/InfoVista/Portal/site/rubrics/help/dossier1/dosssier2/fic.jpg;no;555
    dossier1/dosssier2/fic.txt;/opt/InfoVista/Portal/site/rubrics/help/dossier1/dosssier2/fic.txt;no;555
    Et si dans le monfic du résultat voulu on ne veux que le nom du fichier ou répertoire final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ find . -printf "%f;$std%P$ligne\n"
    .;/opt/InfoVista/Portal/site/rubrics/help/;no;555
    dossier1;/opt/InfoVista/Portal/site/rubrics/help/dossier1;no;555
    dosssier2;/opt/InfoVista/Portal/site/rubrics/help/dossier1/dosssier2;no;555
    fic.jpg;/opt/InfoVista/Portal/site/rubrics/help/dossier1/dosssier2/fic.jpg;no;555
    fic.txt;/opt/InfoVista/Portal/site/rubrics/help/dossier1/dosssier2/fic.txt;no;555
    Cordialement.

  4. #4
    Candidat au Club
    Homme Profil pro
    Stagière
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Stagière
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Ce que je veux, c'est avoir dans un fichier :


    lenomdufichieroudossier;/son/arbo/absolu/;no;555;

    Je n'ai pas encore testé mais pourriez vous m'expliquer le code ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Stagière
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Stagière
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Voila ce que j'ai réussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
     
    find . | nawk -F/ -v dir="/opt/InfoVista/Portal/site/rubrics/help/" -v l=";no;555" '
    { 
        OFS="/" ; f=$NF; NF--; sub(/^\.\//,"") ; OFS=";" ; print f,dir $0 l
    }' >> final.txt
    Ca me donne le resultat attendu , mais voila :

    Mon fichier final.txt contient :

    -La premiere ligne correspondante au dossier actuel : "."
    -Les deux dernieres lignes concernent ce script ainsi que le fichier "final.txt"

    Ces 3 lignes sont inutles.
    Soit je les supprimes , soit je l'execute depuis le dossier parent en indiquant le dossier sur lequel je veux appliquer le find.

    Qu'en pensez vous ?

    Merci d'avance.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Je n'ai fait qu'utiliser l'option -printf de la commande find:
    %f
    Nom du fichier, sans nom de repertoire.
    %h
    Repertoires en tete du nom de fichier, (tout sauf le dernier nom).
    %p
    Nom du fichier.
    %P
    Nom du fichier, ainsi que le nom de l'argument de ligne de commande a partir duquel le fichier a ete trouve.

    Pour voir les autres possibilité, faire un:
    Sinon, tu peux aussi dire au find de ne pas prendre en compte certains fichiers et de lui dire aussi à quelle profondeur commencer, ce qui donnerait en réutilisant ton approche (ici, je lui dis de commencer sur la profondeur 1 pour qu'il ne traite pas le "." -ta première ligne- et je lui dis ne pas prendre en compte le fichier final.txt ainsi que le fichier toto.sh -les 2 autres lignes génantes- ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ find . -mindepth 1 -not -name 'final.txt' -not -name 'toto.sh' | nawk -F/ -v dir="/opt/InfoVista/Portal/site/rubrics/help/" -v l=";no;555" '
    {
        OFS="/" ; f=$NF; NF--; sub(/^\.\//,"") ; OFS=";" ; print f,dir $0 l
    }' >>final.txt
    Cordialement.

  7. #7
    Candidat au Club
    Homme Profil pro
    Stagière
    Inscrit en
    Mai 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Stagière
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je suis sous SUN SOLARIS ...
    Et apparement il ne prend aucune des options ( -mindepth et -not )

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Ok, dans ce cas, essaie (mais je n'ai pas de solaris sous la main,donc pas testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ find . ! -name '.' ! -name 'final.txt' ! -name 'toto.sh' | awk -F/ -v dir="/opt/InfoVista/Portal/site/rubrics/help/" -v l=";no;555" '
    {
        OFS="/" ; f=$NF; NF--; sub(/^\.\//,"") ; OFS=";" ; print f,dir $0 l
    }' >>final.txt
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacement du caractère ?
    Par Mvu dans le forum ASP
    Réponses: 9
    Dernier message: 06/01/2005, 18h11
  2. Réponses: 11
    Dernier message: 01/12/2004, 19h09
  3. [CR] Chercher et remplacer un caractère dans 1 chaine
    Par franck.cvitrans dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 29/09/2004, 16h42
  4. Fonction permettant de remplacer des caractères
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 06/09/2004, 15h48
  5. Remplacer un caractère
    Par Mvu dans le forum ASP
    Réponses: 5
    Dernier message: 20/07/2004, 09h57

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