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
Version imprimable
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
Salut,
suffiraCode:
1
2 ls *.c
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
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 :
Code:$> ls "*.c" "*.h"
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
Code:ls | grep -v .[ch]$
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).
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: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...
- *: 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
Bonjour,
Il fallait évidemment supprimer les " " dans mon post précédent... je ne sais même pas pourquoi je les ai mis !Citation:
Envoyé par gangsoleil
7 réponses qui dissertent sur le sexe des anges et aucune qui ne donne la réponse ?
ls * |grep "*.c" ne marche pas parce que grep prend une regexp en argument, ce qui n'a rien à voir avec les wildcards du shell (*, ?, ...). si tu veux filtrer avec grep les fichier qui se terminent en .c, c'est grep "\.c$"
Bonsoir Matafan,
En lisant bien le fil, tu verrais que:
- Tipon20 veut les fichiers qui ne se terminent pas par .c ou .h.
- J'ai donné la solution classique: ls | grep -v .[ch]$
- J'ai donné une solution plus exotique: echo !(*[ch])
C'est bien jmelyn, je suis fier de toi :king:
Note quand même que quand tu dis "ls, grep, awk, sed... implémentent plus ou moins les expressions régulières, mais jamais vraiment de la même façon", tu fais deux erreurs : d'abord ls n'a rien à voir là dedans, puisque l'expansion des *, ? et autres [] est faite par le shell et pas par ls, et ensuite jamais le shell n'a prétendu comprendre les regexps.