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 GNU Discussion :

[sh] Lister des répertoires écrits "en dur" dans des fichiers


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 37
    Points : 10
    Points
    10
    Par défaut [sh] Lister des répertoires écrits "en dur" dans des fichiers
    Bonjour à tous !

    Je dispose d'un très grand nombre de fichiers .ksh, certains contiennent des répertoires écrits en dur (plein différents), à divers endroit au milieu du code. Je dois lister ces répertoires pour après faire un script qui les remplacera par une variable.

    J'aimerais trouver une commande pour extraire ces répertoires, mais je suis pas fort en shell J'ai essayé quelques grep et sed en utilisant le masque '/*/*' , mais je ne m'en sors pas, je ne trouve pas un moyen pour que seul les répertoires soient listés, et pour qu'ils soient tous listés...

    Si vous avez une idée je suis preneur

    Merci d'avance et bonne journée !

  2. #2
    Invité
    Invité(e)
    Par défaut
    La fonction grep devrait t'aider.
    Par contre comme un simple '/' devrait te retourner trop de résultats, il faudrait mieux une partie du nom du répertoire (s'il est fixe pour tous)


  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Merci pour ta réponse

    Il existe plein de répertoires en dur, qui commencent ou finissent jamais pareil, du coup cela nécessite un truc un peu dynamique, en gros je cherche toutes les suites de caractère sans espace qui contiennent au moins 2 fois '/', mais je suis incapable de coder ça

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par melouze Voir le message
    je cherche toutes les suites de caractère sans espace qui contiennent au moins 2 fois '/'
    Pour répondre à ta dernière (et précise) demande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    egrep '/[^ ]*/' fichiers
    où 'fichiers' est la liste des fichiers où chercher (par exemple: *.ksh)

    qui veut dire: je cherche un slash '/'
    suivi de n'importe quel caractère autre que l'espace '[^ ]', en nombre quelconque '*',
    suivi d'un slash '/'

    mais, tu risques de générer des faux-positifs, comme "${MY_ROOT_DIR}/subdir/toto" ...

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Merci !

    C'est déjà une bonne base, je vais me documenter sur les expressions régulières pour essayer d'épurer le résultat. J'ai des dates qui remontent

    Donc reste à :

    - Exclure les dates : un filtre sur du non numérique j'imagine
    - Enlever ce qu'il y a avant et après le répertoire (garder uniquement le répertoire)

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    J'ai enlevé les dates et aussi les #!/bin/ksh en début de shell :

    egrep '[^0-9][^#][^!]/[^ ]*/' *.ksh

    Par contre je sais pas comment n'afficher que le répertoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    export REP_LIMDNS_SC4="/data/flf/sc4scd/recep/LIM_DNS"
    touch /data/flf/sc4scd/logsup/upr/${S_PROCEXE}.${S_NUMPROC}
    Je voudrais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /data/flf/sc4scd/recep/LIM_DNS
    /data/flf/sc4scd/logsup/upr/${S_PROCEXE}.${S_NUMPROC}

  7. #7
    Membre régulier Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Points : 111
    Points
    111
    Par défaut
    Tu pourrais regarder chaine par chaine, et si pour une chaine deux / se suivent, avec n'importe quel caractère en un nombre infini entre les deux, tu récupère la chaine (chaine=mot pour le Shell si j'ai bien compris).
    Le soucis de cette solution, c'est que si dans ton chemin il y a un espace, ton chemin ne sera pas considéré comme un seul mot.
    Après tu peux jouer sur le séparateur ($IFS : Séparateur de champs internes).

    J'ai pas de solution mais juste des idées (je débute )

    Bon courage !

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par melouze Voir le message
    J'ai enlevé les dates et aussi les #!/bin/ksh en début de shell :

    egrep '[^0-9][^#][^!]/[^ ]*/' *.ksh
    C'est bizarre comme regexp!
    ça veut dire: trouver un caractère différent d'un chiffre, suivi d'un caractère différent de '#', suivi d'un caractère différent de '!'...
    Est-ce vraiment cela que tu veux?

    Tu peux combiner des grep et des grep -v:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat *.ksh | egrep '/[^ ]*/' | egrep -v '^#!'
    qui veut dire: ne pas garder les lignes qui commencent ('^') par '#!'

    Pour éliminer les dates, c'est plus dur car tu peux avoir un répertoire qui ressemble furieusement (et peut-être volontairement) à une date comme /truc/machin/2014/06/02 !!!

    Sinon tu peux donc enfiler les filtres:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat *.ksh | egrep '/[^ ]*/' | egrep -v '^#!' | egrep -v '[^/][0-9][0-9]/[0-9][0-9]/[0-9][0-9]'
    pour éliminer les dates du genre jj/dd/mm (le '[^/]' du début sert à ne pas éliminer les répertoires qui ressemblent à des dates).


    Par contre je sais pas comment n'afficher que le répertoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    export REP_LIMDNS_SC4="/data/flf/sc4scd/recep/LIM_DNS"
    touch /data/flf/sc4scd/logsup/upr/${S_PROCEXE}.${S_NUMPROC}
    Je voudrais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /data/flf/sc4scd/recep/LIM_DNS
    /data/flf/sc4scd/logsup/upr/${S_PROCEXE}.${S_NUMPROC}
    une "heuristique" pour tes 2 cas consiste à "piper" avec une commande de mise en forme comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     | sed -e 's:[^"]*"\(/[^"]*\)".*:\1:' -e 's:[^/]*/:/:'
    qui veut dire: remplacer toute ligne contenant des caractères différents de '"', suivis d'un '"',
    suivi d'un groupe contenant {un '/', suivi de caractères différents de '"'}, suivi d'un '"', suivi de n'importe quoi
    par le groupe (qui était contenu entre les guillemets)

    Attention! S'il y a plusieurs guillemets dans la ligne, ça ne rend que le premier...
    La correction est laissée en exercice au lecteur (on envisagera dans un premier temps de traiter à part les lignes contenant plusieurs groupes de guillemets)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat blop
    export REP_LIMDNS_SC4="/data/flf/sc4scd/recep/LIM_DNS"
    touch /data/flf/sc4scd/logsup/upr/${S_PROCEXE}.${S_NUMPROC}
     
    $ cat blop  | sed -e 's:[^"]*"\(/[^"]*\)".*:\1:' -e 's:[^/]*/:/:'
    /data/flf/sc4scd/recep/LIM_DNS
    /data/flf/sc4scd/logsup/upr/${S_PROCEXE}.${S_NUMPROC}
    Mais ça reste très heuristique...

    Sinon, plutôt que de tout vouloir traiter en une seule opération, je procèderais par petits pas, en commençant par le plus spécifique pour aller vers le plus général.
    Par exemple, traiter en premier tous les cas d'une affectation avec guillemets:
    puis les affectations sans guillemets
    etc.
    en vérifiant ce qu'on pêche à chaque étape...

Discussions similaires

  1. Problème d'autorisation des répertoires d'un disque dur
    Par bendesarts dans le forum Windows 7
    Réponses: 2
    Dernier message: 28/02/2011, 13h21
  2. [XML] Lister des fichiers dans des répertoires
    Par voxiz dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 16/02/2010, 17h25
  3. Réponses: 3
    Dernier message: 04/12/2007, 13h22
  4. Comment indexer et rechercher dans des répertoires ?
    Par elitost dans le forum Windows XP
    Réponses: 2
    Dernier message: 18/07/2006, 22h01

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