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 :

Réaliser Find manuellement


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut Réaliser Find manuellement
    Bonjour,

    Je suis débutant dans l'art d'écrire en shell ^^ et j'aimerais réaliser un find mais manuellement. En fait, ce serait un find bien limité, pusique je n'aurais qu'un étage de sous-répertoires :

    répertoirePrincipal : sousRep_1 sousRep_2 ... sousRep_n (chaqu'un ayant un certain nombre de fichiers)

    Ce serait à priori une boucle parcourant récursivement les sous-répertoires et une parcourant ensuite tous les fichiers de ces répertoires.

    Seulement, je ne sais pas trop quelles conditions d'arrêt mettre dans ces boucles, comment dire "quand tu auras parcouru tous les sousRépertoires" ou de façon similaire pour la deuxième boucle "quand tu auras parcouru tous les fichiers". C'est peut-être simple, mais je ne vois vraiment pas.
    Aussi, j'aimerais savoir, et c'est peut-être lié, comment entrer dans le premier répertoire, puis le deuxième, etc sans connaître leurs noms.

    D'avance, prière de m'excuser si mes questions sont absurdes
    Et merci à l'âme charitable qui me mettra sur la voie

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 450
    Points
    19 450
    Par défaut
    Salut.

    Ce bout de code pourra peut être te servir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
     
    for i in * # on parcourt le répertoire courrant élément par élément
    do
        if [ -d $i ] # si $i (position du curseur lors du parcours) est un répertoire
        then
            # traitements ...
        fi
    done
    Bonne chance

    Cordialement,
    Idriss

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    Je vais regarder ça de plus près .

    Merci.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 595
    Points : 19 480
    Points
    19 480
    Par défaut
    GRRR...
    il faut juste définitivement oublier d'utiliser ls dans un script, parce que sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    touch mon\ fichier
    <s>for i in $(ls ./); do echo "$i"; done</s>
    mon
    fichier
    et préférer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in *; do echo "$i"; done
    mon fichier
    !!!

  5. #5
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 450
    Points
    19 450
    Par défaut
    Effectivement (merci).

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    Idriss :

    Le code est très bien, encore merci !

    En fait j'ai plus qu'une question au final, de la même façon qu'on parcourt tous les éléments du répertoire REP, on va parcourir les éléments du sous-répertoire courant. La condition sera if [ -f $k ] pour dire que si on est sur un FICHIER cette fois on fait "blablabla", bref ça nickel.
    Par contre, ma seule question est alors, comment entrer dans ce sous-répertoire lorsque le curseur est sur ce dernier, donc avant de rentrer dans ma deuxième boucle. Il faudrait que je fasse une sorte de SOUSREP = "sous-répertoire courant" mais je ne sais justement pas comment. Je suppose que c'est grâce à mon $i ?

    N_BaH :


    Ton code passe en revue tous les éléments du répertoire ?
    Et pourquoi éviter ls en fait ("je vais encore passer pour un noob") :p ?
    J'ai toujours du mal à comprendre tes codes lol, désolé.

  7. #7
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 450
    Points
    19 450
    Par défaut
    Citation Envoyé par slig_80 Voir le message
    Et pourquoi éviter ls en fait ("je vais encore passer pour un noob") :p ?
    Parce que si tu as un fichier un nom composé d'espace, il sera perçu comme plusieurs occurrences dans la boucle (comme le montre l'exemple de N_Bah). Ce qui n'est pas le cas en parcourant le répertoire courant à l'aide du symbole *

    Après si tu veux parcourir un répertoire autre que le répertoire courant dans lequel tu exécutes le script, tu peux t'arranger avec un cd avant la boucle.

    J'ai adapté mon code en fonction de la remarque pertinente de N_Bah. Après on peut parfois être amené à utiliser ls pour récupérer plus d'informations (les droits des fichiers, l'utilisateur propriétaire, etc).

  8. #8
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    ha ok effectivement, très bonne remarque de N_BaH qui m'aura empêcher de me prendre la tête à savoir pourquoi ça foirait

    Bon je vais changer ça tout de suite.

    Merci à vous deux

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    Tiens au point ou j'en suis, comment peut-on obtenir le nom du répertoire courant ?

    pwd donne le chemin et pas que le nom...

  10. #10
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 450
    Points
    19 450
    Par défaut
    Citation Envoyé par slig_80 Voir le message
    Par contre, ma seule question est alors, comment entrer dans ce sous-répertoire lorsque le curseur est sur ce dernier, donc avant de rentrer dans ma deuxième boucle. Il faudrait que je fasse une sorte de SOUSREP = "sous-répertoire courant" mais je ne sais justement pas comment. Je suppose que c'est grâce à mon $i ?
    Sans utiliser ls :

    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
    #!/bin/bash
     
    if [ $# -ge 1 ] && [ -d $1 ] # Si on as au moins un paramètre et que le premier paramètre est un répertoire
    then
        cd $1 # on va dans ce répertoire
    fi
     
    for i in *
    do
        if [ -d $i ]
        then
            for j in $i/*
            do
                # ... traitements
            done
        else
            # ... traitements
        fi
    done

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    lol oui ,j'avais oublié ma question en cours de route ^^

    Merci

  12. #12
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    euh, quand je fais un pwd dans ma deuxième boucle il n'a pas l'air d'être entré dans le sous-répertoire...

  13. #13
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par ok.Idriss Voir le message
    for j in $i/*
    Attention que si $i/* est un répertoire vide, tu va obtenir une variable j qui va valoir 'repertoirevide/*'

  14. #14
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    Attention que si $i/* est un répertoire vide, tu va obtenir une variable j qui va valoir 'repertoirevide/*'
    Oui, j'ai fait attention à ce qu'il y ait des fichiers dans mes sous-dossiers

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 595
    Points : 19 480
    Points
    19 480
    Par défaut
    Citation Envoyé par ok.idriss
    Après on peut parfois être amené à utiliser ls pour récupérer plus d'informations (les droits des fichiers, l'utilisateur propriétaire, etc).
    pourquoi ? pour utiliser cut ou sed ou awk derrière ? stat donne des résultats précis et concis.

    Citation Envoyé par becket
    Attention que si $i/* est un répertoire vide, tu va obtenir une variable j qui va valoir 'repertoirevide/*'
    oui, il faut utiliser shopt -s nullglob avant de démarrer la boucle.

  16. #16
    Membre à l'essai
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    En fait, faire pwd ést débile, car c'est comme quand on fait un find, le dossier courant reste celui du début donc faire un pwd m'induisait en erreur.

    Et là apparemment tout fonctionne. Donc un grand merci à vous tous et un merci particulier à Idriss

  17. #17
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 450
    Points
    19 450
    Par défaut
    Bonjour.

    Citation Envoyé par N_BaH Voir le message
    pourquoi ? pour utiliser cut ou sed ou awk derrière ? stat donne des résultats précis et concis.
    C'est vrai, je n'aurais pas du dire "on peut être amené à utiliser ls" mais tout simplement "on pourrait utiliser ls". Mais la sortie de ls -l étant structurée (en colonnes), on a pas besoin de la parser à l'aide de sed ou awk (ou même cut), non ?

    Exemple :
    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
     
    ls -l | while true
    do
        read ligne # on récupère la ligne (ou est positionné le curseur)
     
        if [ "$ligne" = "" ] # si la ligne est vide (dernière ligne)
        then
            exit # on stop la boucle
        else
            set -- $ligne # on éclate la ligne
            echo $1 # les droits (premier mot de la ligne)
            echo $3 # utilisateur propriétaire
            # ...
        fi
    done
    Cependant comme tu le dis, il semble bien mieux d'utiliser stat (dont je n'avais pas trop l'habitude d'utiliser jusqu'ici mais dont je viens de voir les différentes options via la man page) afin d'éviter les boucles un peu tordues comme celle que je viens de faire .

    Cordialement,
    Idriss

  18. #18
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ls -l | while true
    do
        read ligne
    pourquoi ne pas faire?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ls -l | while read ligne
    do

  19. #19
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 450
    Points
    19 450
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    Au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ls -l | while true
    do
        read ligne
    pourquoi ne pas faire?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ls -l | while read ligne
    do
    Effectivement, c'est une simple (mauvaise) habitude héritée des cours que j'ai reçus auparavant ...

  20. #20
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par ok.Idriss Voir le message
    Effectivement, c'est une simple (mauvaise) habitude héritée des cours que j'ai reçus auparavant ...
    cette forme n'est pas mauvaise en soi, c'est une écriture différente.
    je m'interrogeais sur la raison c'est tout.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [11g] Réaliser des formulaires manuellement
    Par shayn dans le forum Forms
    Réponses: 3
    Dernier message: 07/11/2013, 00h20
  2. [Silverlight] réaliser un manuel (aide) pro
    Par Husqvarna dans le forum Visual Studio
    Réponses: 0
    Dernier message: 25/01/2011, 17h23
  3. Réalisation d'une notice / manuel d'utilisation d'un logiciel
    Par HerQuLe dans le forum Gestion de projet
    Réponses: 7
    Dernier message: 14/02/2009, 01h18
  4. msi ou comment réaliser un installeur?
    Par herzleid dans le forum Delphi
    Réponses: 11
    Dernier message: 09/04/2007, 20h27
  5. [imprecis]Réaliser a^n avec seulement l'opérateur d'addition
    Par Amon dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 08/11/2002, 23h22

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