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 :

find et conditions changeantes


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut find et conditions changeantes
    Bonjour à tous,
    Je pensai faire une commande find avec conditions changeantes du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FILELIST="$(find "$FILTER")"
     
    avec $FILTER pouvant être, selon les besoins,
    soit FILTER="-name \"*.txt\""
    soit FILTER=". type f"
    mais cela ne marche pas. La chaîne FILTER n'est pas reconnue par find.

    Je peux faire au mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FILTER="*.txt"
    FILELIST="$(find -name "$FILTER")"
    Y a-t-il une solution pour construire dynamiquement les conditions de filtre ?

  2. #2
    Membre expérimenté Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Par défaut
    Moi ça marche en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FILTER="-name "*.txt""
    find $FILTER
     
    FILELIST=$(find $FILTER)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut
    J'ai oublié de préciser que j'utilise FILELIST dans une boucle for. Le code ressemble plutôt à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FILTER="-name \"*.txt\""
    FILELIST=$(find "$FILTER")
    for filename in $FILELIST
    do
    ...
    done
    mais cela génère une erreur :
    find: prédicat inconnu « -name "*.txt" »
    J'ai essayé plusieurs écritures différentes sans trouver la formule.

  4. #4
    Membre expérimenté Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FILTER="-name "*.txt""
    FILELIST=$(find $FILTER)
    for filename in "$FILELIST"
    do
    echo "$filename"
    done
    Ca trouve même correctement des noms de fichiers avec espaces

  5. #5
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Il manque pas un nom de dossier où chercher quelque part ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut
    Non, je ne pense pas. Car si je teste dans une console :
    j'obtiens un résultat

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Essaie en séparant chaque option...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FILTER="-name"
    NAME="\"*.txt\""
    FILELIST=$(find "$FILTER" "$NAME")
    for filename in $FILELIST
    do
    ...
    done

  8. #8
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    ça ne va pas l'aider puisque le but est de pouvoir modifier $FILTER

    tu devrais utiliser xargs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FILTER=". -name \"*.txt\""
    for FILENAME in $(echo $FILTER | xargs find)
    do
    basename  $FILENAME
    done
    edit: à adapter car ça ne marchera pas avec des espaces !

    comme ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FILTER=". -name \"*.txt\""
     
    while read N
    do
    basename "$N"
    done < <(echo $FILTER | xargs find)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    grrr! on ne fait pas for item in $(command)
    !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ ls -1
    my file
    my file.txt
    my_file.txt
    $ filter=( -name '*.txt' )
    $ for i in $(find ./ "${filter[@]}"); do echo "$i"; done
    ./my
    file.txt
    ./my_file.txt
    d'autant plus que find dispose d'une option d'action -exec COMMAND \;
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    ouais, je sais, d'où mon edit

    par contre, comment tu utilises -exec avec le xargs ?!

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    ah, mais on n'utilise pas non plus xargs !

    find se suffit à lui-même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ filter=( -name '*.txt' )
    $ find ./ "${filter[@]}" -exec basename {} \;
    my file.txt
    my_file.txt
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Ouais, j'ai bien vue cette jolie solution, mais j'ai le malheur de travailler sur des vieux unix où je n'ai ni bash, ni des versions récentes des OS...

    Donc j'aime bien trouver des solutions marchant sur des trucs vieux :p

    Or, ceci marche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FILTER=". -name \"*.txt\""
     
    echo $FILTER | xargs find | while read N
    do
    basename "$N"
    done
    mais ça serait plus propre d'utiliser -exec, cela étant, je ne sais pas comment puisque je ne sais pas différencier les {} d'xargs et ceux de -exec

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    quitte à utiliser des vieux machins : tu as bien conscience que xargs ne fonctionnera pas avec un boulier, n'est-ce pas ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par Alek-C Voir le message
    ça ne va pas l'aider puisque le but est de pouvoir modifier $FILTER
    Mais si, par contre il faudra modifier et FILTER et NAME. Le but était surtout de palier à l'erreur "find: prédicat inconnu « -name "*.txt" » "...

  15. #15
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    soit FILTER="-name \"*.txt\""
    soit FILTER=". type f"
    Je pense que le but, c'est qu'il puisse potentiellement utiliser des FILTER comportant un ou dix argument(s)

    @N_BaH : les sociétés sont en retard, mais quand même

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut
    En séparant chaque option comme le suggère zipe31, le code suivant marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FILTER="-name"
    NAME="\"*.txt\""
    FILELIST=$(find "$FILTER" "$NAME")
    for filename in $FILELIST
    do
    ...
    done
    Par contre, je ne comprend pas la différence avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FILTERNAME="-name \"*.txt\""
    FILELIST=$(find "$FILTERNAME")
    for filename in $FILELIST
    do
    ...
    done
    ...qui ne marche pas. J'avoue que la raison m'échappe.

    C'est un bon début mais si les critères changeants de find sont multiples comment faire ?
    Alek-C à presque raison, le but est de pouvoir changer les options de find pour construire la commande à l'exécution.

  17. #17
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par Alek-C Voir le message
    Je pense que le but, c'est qu'il puisse potentiellement utiliser des FILTER comportant un ou dix argument(s)
    Oui ça je l'avais bien compris, et comme j'ai la même erreur qui sort chez moi, voilà pourquoi j'avais proposé cette solution qui effectivement n'est est pas tout a fait une

    <ModeDenisotON>
    Désolé
    <ModeDenisotOFF>

  18. #18
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Citation Envoyé par Brunoo Voir le message
    ...
    Par contre, je ne comprend pas la différence avec :
    ...qui ne marche pas. J'avoue que la raison m'échappe.
    ...
    C'est une histoire de gestion des paramètres, mais il faudrait voir le fonctionnement du shell pour avoir les détails du problème je pense...

    Mais tu as 2 solutions qui fonctionnent, donc ça ne vaut peut-être pas le coup de trop te compliquer la vie

    La solution de N_BaH (où tu utilises un tableau pour les paramètres) si tu es sous un OS ne datant pas de l'age de pierre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FILTER=( -name '*.txt' )
    find ./ "${FILTER[@]}" -exec basename {} \;
    Ou la mienne pour du vieil Unix (ne marchera à priori pas avec un fichier comportant un saut de ligne dans le nom, mais pour le reste, ça devrait être bon) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FILTER=". -name \"*.txt\""
     
    echo $FILTER | xargs find | while read N
    do
    basename "$N"
    done

Discussions similaires

  1. [Débutant] Condition sur find
    Par SAKDOSS dans le forum MATLAB
    Réponses: 2
    Dernier message: 09/08/2011, 15h36
  2. Réponses: 1
    Dernier message: 25/02/2009, 23h05
  3. Pb de condition dans un Find
    Par cissou06 dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 04/03/2008, 11h54
  4. [VBA-E] Find + condition + attribution variable
    Par Helios07 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/03/2007, 16h33
  5. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 12h48

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