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 :

filtrer des fichier par extention dans un repertoire


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
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Par défaut filtrer des fichier par extention dans un repertoire
    bonjour ,

    pouvez vous m'eclairsir sur ce point :

    je veux filtrer sur les fichier dont l'extention est .c je fait comme commande :


    ls * |grep "*.c" mais ca marche pas .


    merci pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    suffira

  3. #3
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Par défaut
    oui , mais pour mon cas je veux selection les fichiers par exemple: les fichier qui ont une autre extention que les fichier .c et .h

    ls |egrep -v


    merci pour votre aide

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Que cherches-tu à faire exactement ? Lister tous les fichiers .c et .h ? Dans un unique répertoire ou dans une arborescence ?

    Si c'est dans un unique répertoire :
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Je ne pense pas que cela marche; sauf si tu as un fichier qui s'appelle *.c et un autre qui s'appelle *.h
    Pour reprendre ce que dit jmelyn en fait pour ce qui est fichiers (donc pour ls), tout est fait par le shell (bash par exemple) d'où le fait que ce qui est ci-dessus ne marche pas.

    Mais ls *.[ch] est géré par le shell et ce qui est réellement exécuter est (ls <liste-des-fichiers-finissants-par-.c> <liste-des-fichiers-finissants-par-.h>), il suffit de faire un strace pour s'en assurer.
    Pour en revenir au problème principal, la différence c'est que pour la ligne de commande (i.e. interprétée par le shell) ce n'est pas la même règle que pour grep (et autre awk, perl...), i.e. pour le shell * représente .* en regexp (n'importe quoi répété entre 0 et +inf).

  6. #6
    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 : 61
    Localisation : France

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

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

    Je vais rebondir sur ce que tu as dit, D[r]eadLock. Ne le prends pas mal, cela me permet aussi de mieux comprendre Bash.

    La commande ls * est extrèmement intéressante:
    1) D'abord, ls est interprété comme une commande.
    2) Ensuite, * est interprété comme son paramètre. Mais Bash y met son grain de sel en interprétant certaines choses (certaines seulement): ce n'est pas * qui est envoyé à ls (cette commande ne connaît aucune expression régulière, malheureusement), mais une liste de noms... la liste des fichiers du répertoire courant! Autrement dit, le shell liste le répertoire courant, puis il passe cette liste à la commande ls! Vous ne me croyez pas? Essayez donc la commande echo *: vous aurez le même résultat que ls. Et ce n'est pas tout...
    3) La commande ls va prendre chaque nom de la liste fournie par le shell et lister (afficher) ce fichier. Mais si c'est un répertoire, ls va lister ce répertoire entier, comme le ferait un find . -maxdepth 1.

    En plus, le shell ne connaît pas que le caractère spécial *, il y en a plein d'autres, spécifiques au shell bien sûr. En voici la liste:
    • *: tous les noms
    • ?: un seul caractère
    • [...]: un seul caractère au choix entre [ et ]
    • ?(pattern): 0 ou 1 fois le pattern
    • *(pattern): 0 ou plusieurs fois le pattern
    • +(pattern): 1 ou plusieurs fois le pattern
    • @(pattern): 1 fois le pattern
    • !(pattern): tout sauf le pattern
    En sachant que pattern est une pseudo expression régulière. Donc, pour lister tous les fichiers du répertoire courant qui ne se terminent pas par .c ou .h, la commande: echo !(*[ch]) va très bien...

  7. #7
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,
    Citation Envoyé par gangsoleil
    Citation Envoyé par D[r]eadLock Voir le message
    Je ne pense pas que cela marche; sauf si tu as un fichier qui s'appelle *.c et un autre qui s'appelle *.h
    Il fallait évidemment supprimer les " " dans mon post précédent... je ne sais même pas pourquoi je les ai mis !
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  8. #8
    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 : 61
    Localisation : France

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

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

    Ta demande n'était pas claire, j'aurais répondu comme Mygale1978.

    Le problème fondamental avec les commandes Linux est que le format de sélection n'est pas commun: ls, grep, awk, sed... implémentent plus ou moins les expressions régulières, mais jamais vraiment de la même façon. J'aimerais apprendre une fois pour toutes ces formats abscons et pouvoir les réutiliser partout: ls ^[ch]$ par exemple pour lister les fichiers qui ne se terminent pas par .c ou .h. Mais non, il est nécessaire d'utiliser grep en plus pour obtenir ce résultat. Et même parfois egrep! Puisque Linux bouge régulièrement, peut-être un jour nous finirons par rendre les commandes, leurs options et les critères de sélection plus simples et logiques.

    Pour ce qui est de ton problème, voici ce que je ferais

Discussions similaires

  1. [Batch] Recopier et renommer des fichiers à la volée dans un autre repertoire.
    Par tee95 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 20/04/2013, 02h53
  2. Mettre dans l'ordre des fichiers par date de modification
    Par ftrap dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/07/2012, 00h15
  3. destruction des extentions des fichiers par un virus
    Par amdmhandicap dans le forum Sécurité
    Réponses: 4
    Dernier message: 18/11/2010, 14h03
  4. [Eclipse 2.1] des fichiers qui sautent dans WEB-INF/classes
    Par iubito dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 04/10/2004, 16h07
  5. Réponses: 1
    Dernier message: 19/08/2003, 16h11

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