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 :

Lister récursivement les fichiers d'un répertoire


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Points : 83
    Points
    83
    Par défaut Lister récursivement les fichiers d'un répertoire
    Bonjour,

    J'aimerai lister tous les fichiers d'un répertoire (contenus également dans les sous-répertoires) et afficher leur chemin complet.

    Je connais la commande "ls -RF1" qui me donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ls -RF1 /s2/cbr00/acc.d/
     
    /s2/cbr00/acc.d/:
    acc_01.d/
    f1
    qual
    tarif
     
    /s2/cbr00/acc.d/acc_01.d:
    0820820820
    acc
    Je voudrais qu'elle me retourne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /s2/cbr00/acc.d/acc_01.d/
    /s2/cbr00/acc.d/f1
    /s2/cbr00/acc.d/qual
    /s2/cbr00/acc.d/tarif
     
    /s2/cbr00/acc.d/acc_01.d/0820820820
    /s2/cbr00/acc.d/acc_01.d/acc
    Savez vous comment je peux procéder?
    J'ai pensé faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ls -RF1 /s2/cbr00/acc.d/*
    /s2/cbr00/acc.d/f1
    /s2/cbr00/acc.d/qual
    /s2/cbr00/acc.d/tarif
     
    /s2/cbr00/acc.d/acc_01.d:
    0820820820
    acc
    Mais je n'obtient pas le chemin complet des fichiers situés dans les sous répertoires, pouvez vous m'aider?

  2. #2
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #!/bin/bash
    #
    # le programme prend en paramêtre un répertoire
    #
    # But du script : lister récursivement les répertoires à partir d'un répertoire donné en paramêtre
    #
     
    function liste_repertoire
    {
    for i in $(ls -1AF $1 | grep ".*/$")
    do
    repertoire=$1"$i"
    	if [[ -d $repertoire ]]
    		then
    			echo $repertoire
    			cd $repertoire
    			liste_repertoire $repertoire
    	fi
    done
    }
     
    if [[ -z $1 ]]
    	then
    		liste_repertoire $(pwd)"/"
    elif [[ -d $1 ]]
    	then
    		liste_repertoire $1"/"
    else
    	echo $1" n'est pas un répertoire."
    	echo "Fin du programme."
    	exit
    fi
    Voici un petit script dont tu devrait pouvoir t'inspirer.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 388
    Points : 502
    Points
    502
    Par défaut
    Lu,

    Tu peux aussi utiliser la commande find comme ici

  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 376
    Points
    19 376
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
     
    getFiles() {
       Rep="$1"
       for item in $Rep/*
       do [ -f "$item" ] && echo "$item"
          [ -d "$item" ] && getFiles "$item"
       done
    }
     
    [ -d "${1:-.}" ] && getFiles ${1:-.}
    Je le dis encore une fois, pour ceux qui n'étaient pas là, et ceux qui ne suivent pas : il faut éviter d'utiliser ls dans les scripts !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    @N_BaH : Quelle incidence (danger cela représente) en dehors de l'aspect esthétique ?

    Pour cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ -d "${1:-.}" ] && getFiles ${1:-.}
    c'est cette syntaxe que tu utilise ?
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Points : 83
    Points
    83
    Par défaut
    J'aurai bien aimé éviter d'écrire plusieurs lignes de commande car c'est ce que j'avais fait, qui m'a ralenti énormément mon script, et c'est pourquoi je suis venu demander de l'aide ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    sons_r=`ls -RF1 $jj`
                            for k in $sons_r
                            do
                                gpoint=`$Echo "$k"|grep ":"`
                                    if [ "$gpoint" != "" ]
                                    then
                                        sons_r2tmp=`$Echo "$k "|cut -d":" -f1`
                                    else
                                        sons_r2=`$Echo -e "$sons_r2\n$sons_r2tmp/$k"`
                                    fi
                            done
    La partie qui différencie les lignes contenant ":" des autres est gourmande dans mon script: si je l'enlève je gagne environs 30 secondes sur un script qui met 40 secondes à s'executer.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Points : 83
    Points
    83
    Par défaut
    Je vais tester avec le script de N_Bah, il m'a l'ai bon lui, merci mec.
    Je ne connais pas cette syntaxe:

    do [ -f "$item" ] && echo "$item"
    [ -d "$item" ] && getFiles "$item"

    est ce que [ -f "$item" ] && echo "$item" équivaut à
    if [ -f "$item" ] then && echo "$item" fi

    ?

  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 376
    Points
    19 376
    Par défaut
    Bonjour,

    Citation Envoyé par petdelascar
    est ce que [ -f "$item" ] && echo "$item" équivaut à
    if [ -f "$item" ] then && echo "$item" fi
    en fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ -f "$item" ]; then echo "$item"; fi
    la forme courte est à réserver pour des tests simples !


    Citation Envoyé par Winnt
    Quelle incidence (danger cela représente) en dehors de l'aspect esthétique ?
    ça ne représente pas vraiment de danger. Par contre, ça alourdit, et ralentit, le script en faisant appel à des commandes externes, alors que Bash peut le faire tout seul (voir : Développement des chemins)
    De plus, ls ne retourne pas les chemins vers les fichiers qu'il liste.

    Pour cette ligne
    Code :
    [ -d "${1:-.}" ] && getFiles ${1:-.}
    c'est cette syntaxe
    Code :
    ${paramètre:ind}
    que tu utilise ?
    le Remplacement des Paramètres, utilisé ici est le premier de la liste :
    ${paramètre:-mot}
    Utilisation de valeurs par défaut. Si le paramètre est inexistant ou vide, le développement du mot et substitué. Sinon, c’est la valeur du paramètre qui est substituée.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    Il s'agit donc d'un souci de performance et concision.

    le Remplacement des Paramètres, utilisé ici est le premier de la liste :
    ${paramètre:-mot}
    Utilisation de valeurs par défaut. Si le paramètre est inexistant ou vide, le développement du mot et substitué. Sinon, c’est la valeur du paramètre qui est substituée.
    Donc si je comprends bien (je sais je suis long à la comprenette ) :
    Si mon paramètre d'appel du script (ici $1) n'est pas saisi on le remplace par le point (pour exécuter dans le répertoire courant ?). Sinon on utilise le paramètre d'appel du script.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  10. #10
    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 376
    Points
    19 376
    Par défaut
    c'est exactement ça.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    Et bien je me coucherais moins *** ce soir
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Points : 83
    Points
    83
    Par défaut
    Merci beaucoup pour vos réponses, effectivement le ls me faisait perdre beaucoup de temps, c'est mieux avec une commande de N_Bah.
    Merci encore, par contre je réalise que ça peux facilement devenir long à executer un script...

  13. #13
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2020
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Traiter les noms de dossier avec des espaces
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
     
    getFiles() {
       Rep="$1"
       for item in $Rep/*
       do [ -f "$item" ] && echo "$item"
          [ -d "$item" ] && getFiles "$item"
       done
    }
     
    [ -d "${1:-.}" ] && getFiles ${1:-.}
    Je le dis encore une fois, pour ceux qui n'étaient pas là, et ceux qui ne suivent pas : il faut éviter d'utiliser ls dans les scripts !
    Bonjour,
    Merci pour le conseil.
    Cependant en testant ta procédure, j'ai un problème
    J'ai un dossier qui s'appelle:
    /var/services/homes/didier/Astral/@eaDir/Astral Travel - the Easy way for Astral Projection.jpg
    Et là, ça boucle sur Astral qui est à la fois l'un des 1er sous-dossier à partir duquel j'éxecute le script et à la fois le 1er mot d'un des noms d'un des sous-dossiers...
    Je crois que c'est un problème de prise en compte des espaces dans le noms de répertoires.
    Une idée pour corriger cela ?

  14. #14
    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 376
    Points
    19 376
    Par défaut
    Je crois que c'est un problème de prise en compte des espaces dans le noms de répertoires.
    oui, bien vu, c'est une erreur.

    Citation Envoyé par NBaH
    il faut toujours mettre le Développement de paramètres entre guillemets. TOUJOURS !
    à moins de savoir pourquoi.
    donc;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ -d "${1:-.}" ] && getFiles "${1:-.}"
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par petdelascar Voir le message
    Bonjour,

    J'aimerai lister tous les fichiers d'un répertoire (contenus également dans les sous-répertoires) et afficher leur chemin complet.

    Mais je n'obtient pas le chemin complet des fichiers situés dans les sous répertoires, pouvez vous m'aider?
    Euh... Je me trompe peut-être mais je ne comprends pas pourquoi personne n'a proposé d'utiliser "find":


    Peut-être parce qu'il manque l'affichage du "/" final des répertoires ? (dans ce cas, reste à trouver le bon "printf"...)

  16. #16
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2020
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Sinon, j'ai réussi également en mettant "$rep)"/* dans le for... in

  17. #17
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Euh... Je me trompe peut-être mais je ne comprends pas pourquoi personne n'a proposé d'utiliser "find":


    Peut-être parce qu'il manque l'affichage du "/" final des répertoires ? (dans ce cas, reste à trouver le bon "printf"...)
    C'est peut-être aussi parce que la question remonte à 2010...
    Cordialement.

  18. #18
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2020
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Traiter les noms de dossier avec des espaces
    Citation Envoyé par N_BaH Voir le message
    oui, bien vu, c'est une erreur.


    donc;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ -d "${1:-.}" ] && getFiles "${1:-.}"
    Désolé, mais ça ne fonctionne pas sur mon NAS Synology (ça boucle encore à un autre niveau).
    (Linux DISKSTATION 3.2.40 #25426 SMP PREEMPT Wed Jul 8 03:10:08 CST 2020 i686 GNU/Linux synology_evansport_415play)
    Mais, j'ai trouvé la parade
    J'ai uniquement remplacé
    par
    et ça fonctionne chez moi.
    Merci

  19. #19
    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 376
    Points
    19 376
    Par défaut
    j'ai dit "TOUJOURS !"

    sauf quand j'oublie.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  20. #20
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Perso, je ne vois qu'un seul cas où on peut-être amené à ne pas mettre de guillemets, c'est via echo lorsque l'on veut se débarrasser des retours à la ligne ou supprimer les espaces redondants ou faire juste du TRIM . Et cela se fait via un echo, VAR=$VAR ne le fera pas.
    Cordialement.

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

Discussions similaires

  1. Lister les fichiers d'un répertoire dans une feuille Excel
    Par AlainTech dans le forum Contribuez
    Réponses: 3
    Dernier message: 10/03/2016, 14h14
  2. [C++/Unix] Lister les fichiers d'un répertoire
    Par bouazza92 dans le forum Linux
    Réponses: 5
    Dernier message: 10/12/2013, 22h07
  3. Script Shell : lister tous les fichiers d'un répertoire et sous rép
    Par raton_laveur dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 22/01/2009, 16h43
  4. lister les fichiers d'un répertoire et les ouvrir
    Par thong36 dans le forum Langage
    Réponses: 1
    Dernier message: 18/10/2006, 10h43
  5. [CF][PPC/C#] Comment lister les fichiers d'un répertoire ?
    Par dady dans le forum Windows Mobile
    Réponses: 18
    Dernier message: 20/05/2005, 14h35

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