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 :

Boucle for with shell patterns


Sujet :

Shell et commandes POSIX

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut Boucle for with shell patterns
    Bonjour.
    J'ai un dossier /usr/local/bin/ contenant ces fichiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dbus-run-session
    desktop-file-validate
    flac
    lxqt-config-session
    lxqt-session
    ...
    Je cherche a extraire avec une boucle for dans ce dossier les fichiers se terminant par session mais ne comportant qu'un seul '-'.
    Depuis cette liste, je cherche donc a obtenir seulement lxqt-session.

    J'y arrive de cette maniére mais j'aurais préféré que le shell me retourne uniquement les fichiers qui m'intéressent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for i in /usr/local/bin/*-session
      do
        j=${i##*/}
        if test ${j#*-} = 'session'
          then
            printf "%s, ${j%-*}"
        fi
      done
    J'ai essayé avec des ...[!-]... sans résultats.
    Existe t'il une solution ?
    Merci.
    Cordialement.

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in /usr/local/bin/*-session; do if [[ $i =~ .*-.*-.* ]];then continue;else echo $i;fi;done
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    merci pour la réponse mais pas trop posix tous ça.
    Ta proposition ne fonctonne qu'avec bash.
    Tu propose un bout de code shell mais je cherchais un pattern du shell permettant d'éviter du code.
    Manifestement, les patterns du shell ne permettent pas une précision de sélection aussi 'pointu' que celle que je recherche.
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ for f in ./*-session; do test $(echo "$f" | tr -cd '-' | wc -m) -eq 2 && echo "$f"; done
    EDIT: je relis le sujet, et je ne comprends pas
    j'aurais préféré que le shell me retourne uniquement les fichiers qui m'intéressent.
    pour les exemples donnés, le code de ton premier message fonctionne apparemment.

    quels sont les faux-positifs que tu observes ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Salut,
    Oui mon script fonctionne mais je cherchais un pattern (genre regex magique) me permettant de récupérer directement dans la boucle for uniquement les fichiers qui m'intéressent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in /usr/local/bin/LePattern_magique
    qui me retournerais dans la liste citée précemment uiquement lxqt-session sans être obligé de faire un traitement pour éliminer lxqt-config-session et dbus-run-session.
    Merci.
    Cordialement.

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Juste pour info, tu confonds les caractères joker et les regex. Dans ton "for", ce sont des caractères joker. Pas des regex.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Salut,
    Non, je ne confond pas les regex et les caractères joker,
    Je cherchais a savoir si en utilisant les caractéres joker du shell, je pouvais obtenir uniquement la liste des fichiers qui m'intéresse sans être obligé de faire un traitement supplémentaire.
    Et donc la réponse est oui ou non et manifestement, c'est non.
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ ls -1 /tmp/testDir
    dbus-run-session
    desktop-file-validate
    flac
    lxqt-config-session
    lxqt-session
    en bash (donc non-POSIX), à force d'essais/erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ shopt -s extglob nullglob
    $ for f in /tmp/testDir/!(*-*)-session; do echo "$f"; done
    /tmp/testDir/lxqt-session
    en gros, je demande à ce qu'il n'y ait pas d'autre tiret.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Boucle for en shell
    Par nielsou dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 12/12/2009, 11h34
  2. Boucle for en shell
    Par Neenux dans le forum Linux
    Réponses: 5
    Dernier message: 28/04/2009, 15h20
  3. [SHELL] Variable dans boucle for
    Par magicwill dans le forum Linux
    Réponses: 6
    Dernier message: 11/08/2007, 11h31
  4. Commande shell boucle for
    Par boula dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 18/07/2007, 15h41
  5. Shell - Erreur dans une boucle for
    Par claralavraie dans le forum Linux
    Réponses: 4
    Dernier message: 11/01/2006, 13h45

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