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 :

Comment compter le nombre de fichiers dans un répertoire et la taille


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 44
    Points : 57
    Points
    57
    Par défaut Comment compter le nombre de fichiers dans un répertoire et la taille
    Bonjour,

    Je souhaiterais créer un script en shell pour compter le nombre de fichier dans un répertoire, et la taille du répertoire contenant les fichiers.

    Je souhaiterais obtenir une architecture qui ressemble à cela: Quand j’exécute le script

    Information :Sachant que j'ai des répertoires du type: old - name linux ne reconnait pas écrit de cette façon faudrait convertir.

    EXEMPLE:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dossier                                             nombre de fichiers          Taille (ko,mo;go)
     
    /répertoire1/repertoire2/repertoire3          12                             100
    /répertoire1/repertoire2/repertoire4          10                             110
    /répertoire1/repertoire2/repertoire5          16                             120
     
    /répertoire1/repertoire2/old - name         12                             100
    ...etc


    Merci de m'aider,


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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Bonjour,

    Voici pour commencer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ find . -type f |sed 's@\([^/]*\)$@ \1@'|awk '{a[$1]++} END{for (i in a) print i,a[i]}'
    En ce qui concerne la taille, ya plus qu'à étudier les options de find par un Bonne chance
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 629
    Points : 30 859
    Points
    30 859
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zara5 Voir le message
    et la taille du répertoire contenant les fichiers.
    Bonjour

    Qu'entends-tu exactement par "taille du répertoire" ??? Est-ce que tu considères que la taille du répertoire est égale à la somme des tailles des fichiers qui y sont contenus ou bien tu veux juste parler de l'espace utilisé pour stocker les noms des fichiers (un répertoire n'est en fait qu'un tableau à 2 colonnes contenant le nom du fichier et son n° d'inode)...???
    Et comment compteras-tu un dossier qui contient 3 sous-dossiers ? Les 3 sous-dossiers seront-ils comptabilisés comme 3 fichiers (dans l'absolu un dossier est bien un fichier donc ce serait cohérent) ou bien tu ne veux comptabiliser que les "vrais" fichiers (ce qu'on appelle "fichier régulier") ???

    A titre d'exemple, voici un petit script de base qui comptabilise le nombre d'items d'un répertoire passé en argument et qui cumule la taille de chaque item quand ceux-ci sont des fichiers réguliers
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/sh
     
    for dir in $*
    do
    	tot=0
    	sum=0
    	for f in "$dir"/*
    	do
    		test -f "$f" && tot=$(expr $tot + $(cat "$f" |wc -c))
    		sum=$(expr $sum + 1)
    	done
    	echo "$dir $sum $tot $(expr $tot / 1000) $(expr $tot / 1000000)"
    done

    Ceci dit, tu devrais aussi t'intéresser à la commande "tree", surtout agrémenté de l'option h (affiche la taille)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 44
    Points : 57
    Points
    57
    Par défaut Merci de vos réponses
    Je vous remercie de m'avoir répondu,

    J'ai pu avancé grâce à vous.

    J'ai trouvé une commande qui me convient mais malheureusement, j'ai un petit soucis avec des dossiers qui sont nommé de cette façon: old - name

    Quand je lance la commande j'ai l'erreur Aucun fichier ou dossier de ce type.
    Mais pour les autres fichiers sa fonctionnes correctement.

    Comment faire en sorte que la commande reconnait ces caractères ?

    Voici la commande:

    #Nombre de fichiers

    for dossier in `find /mnt/répertoire -maxdepth 1 -type d` ; do NBF=`find $dossier -type f -name \* | wc -l`; echo $dossier: $NBF; done


    Merci bcp;

  5. #5
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    essayes déjà de proteger tes variables des interpretations
    avec ${variable} ou "$variable"

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 44
    Points : 57
    Points
    57
    Par défaut
    Salut,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for dossier in `find /mnt/info-igbmc -maxdepth 1 -type d` ; do NBF=`find ${dossier} -type f -name \* | wc -l`; echo ${dossier}: ${NBF}; done
    J'ai essayé Sa fonctionne toujours pas.

    Avez-vous une autre idée.

    Merci,



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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 538
    Points : 19 360
    Points
    19 360
    Par défaut
    Bonjour,

    une boucle forcoupe les données en mots (en se basant sur l'IFS, que je recommande de ne pas modifier), et non en lignes; donc, on n'uilise pas ce type de boucle pour lire la sortie d'une commande, mais une boucle while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ... -print0 | while read -d ' ' line; do :stuff with "$line"; done
    @frp31 : contre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ var="foo bar baz"
    $ printf '%s\n' ${var}
    foo
    bar
    baz
    $ printf '%s\n' "$var"
    foo bar baz
    où l'on voit que les accolades ne protègent pas de la "coupure" en mots.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 629
    Points : 30 859
    Points
    30 859
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par frp31 Voir le message
    essayes déjà de proteger tes variables des interpretations
    avec ${variable} ou "$variable"
    ${variable} sert juste à isoler le nom de la variable quand celui-ci peut porter à confusion
    Exemple
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var=10
    echo "j'ai couru ${var}km"     # Pour éviter que le shell tente d'afficher la variable "$varkm"...

    "$variable" est mieux pensé. Surtout si variable contient un truc style "hello world" (avec un espace) ou mieux, si la variable ne contient rien du tout => test $variable = "" ne fonctionnera pas mais test "$variable" = "" fonctionnera. Malheureusement, comme l'a souligné N_Bah, le problème vient du for qui coupe les items sur l'espace donc bien en amont du traitement de la variable...

    Citation Envoyé par zara5 Voir le message
    Quand je lance la commande j'ai l'erreur Aucun fichier ou dossier de ce type.

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    for dossier in `find /mnt/répertoire -maxdepth 1 -type d` ; do NBF=`find $dossier -type f -name \* | wc -l`; echo $dossier: $NBF; done
    Déjà tu peux enlever l'option "-name \*". Si tu ne cherches pas spécialement de nom particulier, le find te donnera tous les noms qu'il trouve.

    Mais sinon ton vrai problème c'est que for coupe les items sur l'espace. Et donc si tu as un dossier nommé "xxx yyy" le for cherchera à traiter "xxx" puis "yyy" bien entendu sans succès puisqu'aucun de ces dossiers n'existe...

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    find /mnt/répertoire -maxdepth 1 -type d |while read dossier
    do
        echo "$dossier: `find "$dossier" -type f | wc -l`"
    done
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 44
    Points : 57
    Points
    57
    Par défaut Merci à tous de votre aide
    Merci, Frédéric grâce vous j'ai pu résoudre mon problème.

    Je Remercie aussi l'équipe du forum.

    Je vous souhaite un bon W-E


  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 629
    Points : 30 859
    Points
    30 859
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zara5 Voir le message
    Merci, Frédéric grâce vous j'ai pu résoudre mon problème.
    Le tutoiement est autorisé ici. Sinon je doute que la solution soit parfaite car le find interne ira chercher tous les fichiers, même ceux situés en profondeur.

    Exemple: si t'as un dossier "xxx" qui contient un dossier "yyy" qui lui-même contient un fichier "f" => xxx/yyy/f

    Le find xxx -type f | wc -l te donnera 1 (le fichier "yyy/f") mais le find yyy -type f | wc -l te donnera aussi 1 (le fichier "f"). Bref le fichier "f" aura été compté deux fois, ce qui n'est pas franchement tiptop. Mais bon, si cela te convient ainsi...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Bonjour,
    Je suis d'accord avec Sve@r , pour corriger, il suffit aussi de rajouter mindepth, exemple:
    L'arborescence utilisé:
    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
    $ find .
    .
    ./répertoire1
    ./répertoire1/repertoire2
    ./répertoire1/repertoire2/repertoire3
    ./répertoire1/repertoire2/repertoire3/f8
    ./répertoire1/repertoire2/repertoire3/f9
    ./répertoire1/repertoire2/repertoire3/f6
    ./répertoire1/repertoire2/repertoire3/f7
    ./répertoire1/repertoire2/repertoire4
    ./répertoire1/repertoire2/repertoire4/f3
    ./répertoire1/repertoire2/repertoire4/f4
    ./répertoire1/repertoire2/repertoire4/f2
    ./répertoire1/repertoire2/repertoire4/f1
    ./répertoire1/repertoire2/repertoire4/f5
    ./répertoire1/repertoire2/repertoire5
    ./répertoire1/repertoire2/repertoire5/f14
    ./répertoire1/repertoire2/repertoire5/f13
    ./répertoire1/repertoire2/repertoire5/f11
    ./répertoire1/repertoire2/repertoire5/f12
    ./répertoire1/repertoire2/repertoire5/f10
    ./répertoire1/repertoire2/old - name
    ./répertoire1/repertoire2/old - name/f2
    ./répertoire1/repertoire2/old - name/f1
    le code pour compter le nombre de fichiers dans les répertoires se trouvant uniquement dans repertoire2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ find répertoire1/repertoire2/ -mindepth 1  -maxdepth 1 -type d -exec bash -c "echo -n '{}: ' ; find \"{}\" -type f | wc -l" \;
    répertoire1/repertoire2/repertoire3: 4
    répertoire1/repertoire2/repertoire4: 5
    répertoire1/repertoire2/repertoire5: 5
    répertoire1/repertoire2/old - name: 2
    Ici, c'est juste pour l'exemple du mindepth, car il sera difficile (mais je ne pense pas impossible) de le réexploiter pour afficher en même temps la taille totale des fichiers.
    Cordialement.

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 44
    Points : 57
    Points
    57
    Par défaut
    Merci, pour cette solution.


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

Discussions similaires

  1. Réponses: 16
    Dernier message: 26/11/2008, 17h41
  2. Réponses: 1
    Dernier message: 19/06/2008, 18h28
  3. Réponses: 1
    Dernier message: 30/10/2007, 01h07
  4. compter le nombre de fichiers dans un répertoire !
    Par lehic dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 20/11/2005, 18h59
  5. Réponses: 6
    Dernier message: 11/02/2005, 07h41

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