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 :

Tri de fichiers


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 147
    Par défaut Tri de fichiers
    Salut,

    Je dois écrire un srcipt permettant de dénombrer les fichiers du répertoire courant dans les 4 catégories suivantes :
    - Fichiers (cachés ou non) dont le nom se termine par .txt
    - Fichiers (cachés ou non) dont le nom se termine par .sh
    - Fichiers cachés
    - Autres fichiers

    J'aimerai aussi afficher chaque résultat sous la forme :
    Il y a 2 fichiers dont le nom se termine par .txt


    J'aimerai que quelqu'un m'aide à écrire ce script car je galère vraiment.
    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    - initialiser des variables TXT et SH à 0
    - lister le contenu du répertoire à l'aide du boucle for
    - vérifier qu'il s'agit d'un fichier normal
    - vérifier qu'il se termine par .txt
    - incrémenter la variable TXT
    - vérifier qu'il se termine par .sh
    - incrémenter la variable SH
    - fin de la boucle
    - faire afficher la phrase que tu souhaites
    Dernière modification par Invité ; 20/10/2009 à 22h53.

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 147
    Par défaut
    Faut-il effectuer les test dans la boucle for.
    Comment et quoi écrire dans cette boucle ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Lenou
    Faut-il effectuer les test dans la boucle for.
    oui
    J'aurais dû marquer la fin de la boucle (c'est corrigé)

  5. #5
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonsoir,

    Voici une autre manière de faire; si tu ne comprends pas certaines choses, regarde dans la man page. Si toujours pas, demande ici.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    txt=$(find . -maxdepth 1 -type f -regex .*\.txt$ | grep -c .)
    echo "Il y a $txt fichier(s) de type *.txt"
    sh=$(find . -maxdepth 1 -type f -regex .*\.sh$ | grep -c .)
    echo "Il y a $sh fichier(s) de type *.sh"
    hid=$(find . -maxdepth 1 -type f -regex \./\..* | grep -c .)
    echo "Il y a $hid fichier(s) caché(s)"
    oth=$(find . -maxdepth 1 -type f -regex \./[^.].* | grep -c .)
    echo "Il y a $oth fichier(s) non caché(s)"

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 147
    Par défaut
    #! /bin/sh
    TXT=0
    SH=0

    ....


    Il n'y a pas une façon plus simple de le faire et que je puisse comprendre parce que là, je comprends à moitié.
    Je ne connais pas la commande find -maxdepth ...

  7. #7
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    La commande find (en français checher) est spécialisée dans la recherche de fichiers sur de nombreux critères. Ici on demande:

    • de chercher dans le répertoire courant: . (point).
    • de chercher sur un seul niveau: maxdepth veut dire profondeur max, et vaut 1, c'est-à dire qu'on reste dans le même répertoire. Sinon find va chercher dans les sous-répertoires aussi.
    • de ne prendre que les fichiers normaux, pas les répertoires par exemple: -type f.
    • de sélectionner sur le nom avec les expressions régulières: -regex. À la premiere ligne, il y a .* qui veux dire "des caractères quelconques", puis \. qui veut dire "point" et enfin txt$ qui veut dire "txt en fin de nom (du fichier)".

    Dans le cas où find trouve un nom qui correspond, il l'affiche et la commande suivante, grep, récupère le résultat et compte le nombre de lignes récupérées grâce à l'option -c, lignes qui contiennent au moins un caractère (grâce au point).

    Je ne vois pas plus simple. Il faut juste connaître les commandes UNIX. Ça vient un peu à la fois.

  8. #8
    Membre chevronné Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique industrielle
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 407
    Par défaut
    il est aussi possible de compter les lignes par un au lieu de

  9. #9
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    C'est vrai, cboudy. Mais as-tu vu la sortie de la commande wc -l? Il y a le nombre de lignes et le nom du fichier. Si je ne veux que le nombre de lignes, il faut encore couper la sortie par une commande (cut ou awk). C'est pourquoi j'utilise grep -c . dans les scripts, mais wc -l à la main...

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 147
    Par défaut
    J'ai trouvé une façon simple de le faire mais merci pour vos aides ça m'a bien aidé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # ! /bin/sh
    echo « Il y a `ls –al | grep –c ‘^-.*\.txt$’` fichiers dont le nom se termine par .txt »
    echo « Il y a `ls –al | grep –c ‘^-.*\.sh$’` fichiers dont le nom se termine par .sh »
    echo « Il y a `ls –a | grep –c ‘^\.’` fichiers cachés »
    J'ai testé et ça marche bien.

  11. #11
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Plusieurs remarques à la solution que tu proposes:

    • Sous Bash, il vaut mieux utiliser $(...) que `...` parce qu'on peut imbriquer les commandes, et c'est plus lisible.
    • La troisième ligne n'est pas correcte parce que tu y inclus les deux premières entrées qui sont '.' et '..'. Pour être correct, il faut faire un ls -A (almost all). De plus, tu y inclus également les répertoires cachés, le traitement est incomplet!
    • Tu n'as pas calculé le nombre de fichiers non-cachés (autres).

  12. #12
    Membre chevronné Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique industrielle
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 407
    Par défaut
    Citation Envoyé par jmelyn Voir le message
    C'est vrai, cboudy. Mais as-tu vu la sortie de la commande wc -l? Il y a le nombre de lignes et le nom du fichier. Si je ne veux que le nombre de lignes, il faut encore couper la sortie par une commande (cut ou awk). C'est pourquoi j'utilise grep -c . dans les scripts, mais wc -l à la main...
    certes mais dans le cas présent on passe le stdin à wc donc il n'affiche pas de nom de fichier (en tout cas avec la version que j'utilise), donc pas de cut à faire

  13. #13
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2009
    Messages : 10
    Par défaut
    Citation Envoyé par jmelyn Voir le message
    C'est vrai, cboudy. Mais as-tu vu la sortie de la commande wc -l? Il y a le nombre de lignes et le nom du fichier. Si je ne veux que le nombre de lignes, il faut encore couper la sortie par une commande (cut ou awk). C'est pourquoi j'utilise grep -c . dans les scripts, mais wc -l à la main...
    Je pensais idem mais apès vérification, les deux sorties sont identiques.Il me semblait que tu avais raison jmelyn, apparement, vous avez raison tous les deux
    Est-tu sûr de ne pas te tromper d' outil ?
    (wc (GNU coreutils) 6.10 et GNU Grep 2.5.3)

  14. #14
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Je n'ai pas expliqué complètement ce que j'avais en tête, résultat ce que j'ai écrit est incorrect.

    Je voulais dire que dans mes scripts, au gré des évolutions, je passe de pipes aux fichiers et inversement. Dans le cas d'un grep, aucun changement à faire. Mais dans le cas d'un wc, il faut faire un cut supplémentaire si l'on travaille sur un fichier. Pour simplifier je reste au grep. Voilà, c'est tout.

    Mais il est juste de dire que wc fonctionne correctement (nombre de lignes uniquement) lorsqu'il prend son entrée d'un pipe.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Je propose une solution en bash, bien que le sujet soit résolu :
    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
     
    TXT=0 SH=0 HID=0 NHID=0
     
    for file in {.,}*
     do
       [ -f "$file" ] && {
         [ "${file:0:1}" = . ] && ((HID++))
         if [[ "$file" =~ .*\.txt$ ]]; then ((TXT++))
         elif [ "${file##*.}" = sh ]; then ((SH++))
         else
             ((NHID++))
         fi
       }
    done
    echo -e " Il y a $HID fichiers cachés\n \
    Il y a $TXT fichiers dont le nom se termine par .txt\n \
    et $SH fichiers dont le nom se termine par .sh\n \
    Il y a $((NHID-HID)) autres fichiers non-cachés"
    J'ai varié les plaisirs sur la façon de mettre en évidence la manière dont commence et/ou fini une variable (ici des noms de fichiers)
    Sur ~350 fichiers, ça tourne en moyenne à :
    real 0m0.200s
    user 0m0.100s
    sys 0m0.000s

    Bon, ce n'est sûrement pas un foudre de guerre : c'est du bash !

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

Discussions similaires

  1. tri de fichier
    Par sondess dans le forum C
    Réponses: 6
    Dernier message: 17/10/2006, 14h34
  2. [CListCtrl] Tri de fichiers
    Par Rupella dans le forum MFC
    Réponses: 19
    Dernier message: 07/09/2006, 16h40
  3. Tri de fichier avec le "sort"
    Par LFC dans le forum Langage
    Réponses: 1
    Dernier message: 08/03/2006, 07h55
  4. Tri de fichier
    Par difficiledetrouver1pseudo dans le forum Linux
    Réponses: 2
    Dernier message: 22/02/2006, 16h47
  5. [langage] tri de fichier
    Par jj77 dans le forum Langage
    Réponses: 7
    Dernier message: 16/11/2004, 16h35

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