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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    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
    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 averti
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    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 654
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    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
    !!!
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  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
    Par défaut
    Effectivement (merci).

  6. #6
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    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
    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
    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
    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

  9. #9
    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
    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

  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
    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 ...

  11. #11
    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
    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.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    Bonjour,

    Citation Envoyé par ok.idriss
    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 ?
    le problème de "mon fichier" demeure !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in ./*
    do echo "$i"
       stat --printf '%A\n%U\n' "$i"
    done
    ./mon fichier
    -rw-r--r--
    utilisateur
    Citation Envoyé par jabbounet
    cette forme n'est pas mauvaise en soit, c'est une écriture différente.
    si il faut faire un test sur l'existence de la ligne pour éventuellement sortir de la boucle, alors si. D'autant qu'à la lecture d'un fichier, certaines lignes peuvent paraître vides, et faire sortir de la boucle inopinément.
    Code monScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    echo "bla
     
    cra
    ella" | while true
    do read line
       [ "$line" = "" ] && exit
       echo "$line"
    done
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    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
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    si il faut faire un test sur l'existence de la ligne pour éventuellement sortir de la boucle, alors si. D'autant qu'à la lecture d'un fichier, certaines lignes peuvent paraître vides, et faire sortir de la boucle inopinément.
    Code monScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    echo "bla
     
    cra
    ella" | while true
    do read line
       [ "$line" = "" ] && exit
       echo "$line"
    done
    d'accord mais quelle différence avec:
    Code sonscript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    echo "bla
     
    cra
    ella" | while read line
    do
       [ "$line" = "" ] && exit
       echo "$line"
    done

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    Citation Envoyé par jabbounet
    d'accord mais quelle différence
    dans la première forme, on est obligé de passer par un test pour arrêter la boucle (à cause du true),
    dans la deuxième, le test n'est nécessaire que si on veut arrêter la lecture à la première ligne vide.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. [11g] Réaliser des formulaires manuellement
    Par shayn dans le forum Forms
    Réponses: 3
    Dernier message: 06/11/2013, 23h20
  2. [Silverlight] réaliser un manuel (aide) pro
    Par Husqvarna dans le forum Visual Studio
    Réponses: 0
    Dernier message: 25/01/2011, 16h23
  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, 00h18
  4. msi ou comment réaliser un installeur?
    Par herzleid dans le forum Delphi
    Réponses: 11
    Dernier message: 09/04/2007, 19h27
  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, 22h22

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