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
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,
suffira
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part $> ls "*.c" "*.h"
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 !Envoyé par gangsoleil
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 : Sélectionner tout - Visualiser dans une fenêtre à part ls | grep -v .[ch]$
Partager