[bash] exp rationnelles et variable

Fermé
bobo25 - 25 mars 2006 à 23:45
dubcek Messages postés 18748 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 26 septembre 2024 - 29 sept. 2011 à 15:52
Bonjour à tous
j'aurais 2 petites question à poser à propos d'Unix :

1. Quelle est l'expression rationnelle désignant une lettre minuscule.
J'ai essayé par exemple ls -l [a-z]* mais j'ai 2 problèmes : je trouve tous les fichiers dont le nom commence par une lettre (majuscule et minuscule) et ça m'affiche la liste des fichiers en récursif.

2. Comment obtenir le PID d'un processus. Il y a bien la variable $PPID mais pas PID.

Merci

13 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
25 mars 2006 à 23:51
Salut,
1

[root@localhost ~]# ls -l | egrep '^[a-z]+'
total 6396
drwxr-xr-x 4 root lami 4096 aoû 15 2005 abc
drwxr-xr-x 3 root lami 4096 jui 17 2005 abcdelasecurite.free.fr
lrwxrwxrwx 1 root lami 18 sep 8 2005 bin -> /home/lamitest/bin
lrwxrwxrwx 1 root lami 25 jun 27 2005 c -> /mnt/hda5/programmation/c
drwxr-xr-x 3 root lami 4096 jui 17 2005 clx.anet.fr
drwxr-xr-x 2 root lami 4096 jui 13 2005 delete
drwxr-xr-x 3 root lami 4096 mar 20 18:58 eee
drwxr-xr-x 3 root lami 4096 jui 17 2005 free-eos.org
drwxr-xr-x 3 root lami 4096 jui 17 2005 frenchmozilla.sourceforge.net
drwxr-xr-x 3 root lami 4096 jui 17 2005 fr.wikipedia.org
drwxr-xr-x 2 root lami 4096 jui 19 2005 index_fichiers
drwxr-xr-x 2 root lami 4096 jui 17 2005 lea-linux.org
drwxr-xr-x 3 root lami 4096 jui 24 2005 linuxfr.org
drwxr-xr-x 2 root lami 4096 fév 24 07:38 lll
drwxr-xr-x 2 root lami 4096 jui 17 2005 modules.npds.org
drwxr-xr-x 2 root lami 4096 jui 17 2005 pegase.foxalpha.com
drwxr-xr-x 2 root lami 4096 jui 17 2005 petition.eurolinux.org
drwxr-xr-x 2 root lami 4096 jui 17 2005 phpnuke-france.org
drwxr-xr-x 3 root lami 4096 jui 17 2005 prdownloads.sourceforge.net
drwxr-xr-x 2 root lami 4096 jun 26 2005 redirection_site_fichiers
drwxr-xr-x 4 root lami 4096 jui 17 2005 sourceforge.net
drwxr-xr-x 2 root lami 4096 jui 17 2005 tuxmobil.org

2

[root@localhost ~]# pgrep firefox-bin
2786
[root@localhost ~]#
0
ok merci pour ton aide je vais essayer ça :-)
0
Merci mais la première commande ne fonctionne pas.
Je voudrais savoir pourquoi l'expression rationnelle [a-z] n'affiche pas que les caractères minuscules.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
31 mars 2006 à 23:47
Salut,

puique en fait '^[a-z]+' commence au début de chaîne donc elle voit au début drwxr-xr-x

d c'est une minuscule

En bref la commande n'est pas la bonne. Désolé.

Essaie ça
perl -e 'while (<*>) { if (/^[a-z]/ && -f){ system "ls -l $_" }}'     
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci pour ton aide mais j'ai oublié de préciser que c'est à but pédagogique que je cherche à faire ça, pour apprendre le bash en fait.

Quand j'utilise une expression rationnelle pour le premier caractère avec ls, il me cherche les fichiers dans les sous-répertoires.

par exemple je viens d'essayer ls [L]* ça me sort 3 fichiers qui ne sont pas dans le répertoire courant et dont le nom ne commence pas par L

C'est quand même bizarre.

Merci encore pour ton aide :-)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
1 avril 2006 à 09:34
Salut,

apprendre le bash en ce cas http://www.trustonme.net
http://www.ac-creteil.fr/reseaux/systemes/linux/shell-scripts/shell-bash.html
http://www-gtr.iutv.univ-paris13.fr/Cours/Mat/Systeme/TDTP2003/tp03.html
http://abs.traduc.org/abs-3.4-fr/index.html

En ce qui concerne la commande ls son rôle est d'afficher le contenu d'un répertoire courant et pas de traiter les expressions régulières (regex - Regular Expression).

En revanche on peut exploité le résultat de ls par le biais d'un pipe | (à lir paip et pas pip ) ou tube si tu veux.

Que veut dire ça?

La sortie de ls on le transmet à une autre commande

cmd1 | cmd2

donc la sortie de cmd1 et l'entrée de cmd2

En ce qui conerne ta commande ls [L]* il faut regarde dans man ls le SYNOPSIS de la commande

ls [options] [fichier...]

Donc ls ne traite pas les regex.
ls -l a* veut dire d'afficher les fichiers qui commence avec a

Mais a* ce n'est pas une regex. C'est une globalisation, à lire a suit de n'importe quel caractère ( en regex on écrit a.* ).
[lamitest@localhost ~]$ ls -l a*
-rwx------  1 lamitest lamitest     327 jan 27 20:37 aaaaa
-rw-rw-r--  1 lamitest lamitest       0 mar  5 13:15 aaa_bbb.sql
-rw-rw-r--  1 lamitest lamitest       0 mar  5 13:15 aaa_BBB.sql
-rw-rw-r--  1 lamitest lamitest       0 mar  5 13:15 aaa.sql
-rwx------  1 lamitest lamitest      42 mar  4 20:43 aa.sh
-rw-rw-r--  1 lamitest lamitest   68159 mar 28 23:21 affich-2168110-en-perl-recuperer-un-texte-entre-2-balises.htm
-rw-rw-r--  1 lamitest lamitest     260 jan 15 16:48 amariei.html.txt
-rw-rw-r--  1 lamitest lamitest 2421491 jan 15 17:36 archive
-rw-rw-r--  1 lamitest lamitest 1362673 jan 15 17:35 archive.tar.bz2
-rw-rw-r--  1 lamitest lamitest 2421491 jan 15 17:33 archive.tar.gz
-rwx------  1 lamitest lamitest     952 oct  8 20:16 array_intersect.pl
-rwx------  1 lamitest lamitest    4849 nov 16 21:14 avider
-rwxrwxrwx  1      700 lamitest     154 nov 16 21:14 avider.c
[lamitest@localhost ~]$ ls -l A*
-rw-rw-r--  1 lamitest lamitest 0 mar  5 13:15 AAA_bbb.sql
-rw-rw-r--  1 lamitest lamitest 0 mar  5 13:15 AAA_BBB.sql
-rw-rw-r--  1 lamitest lamitest 0 mar  5 13:15 AAA_.sql
[lamitest@localhost ~]$ ls 'a.*'
ls: a.*: Aucun fichier ou répertoire de ce type
[lamitest@localhost ~]$

La commande que je t'ai donné en 1er ne fonctionne pas ( je n'a pas fait attention en fait puisque j'avais que des fichiers avec de nom qui commenca avec une minuscules)

Voilà un bon ex :

Minuscules
[lamitest@localhost ~]$ ls | egrep '^[a-z]+'
aaaaa
aaa_bbb.sql
aaa_BBB.sql
aaa.sql
Majuscules
[lamitest@localhost ~]$ ls | egrep '^[A-Z]+'
AAA_bbb.sql
AAA_BBB.sql
AAA_.sql
CGI-Session-4.03
Desktop
FileZilla_3_i386-linux-bin.tar.bz2
Sans titre.JPG
T1T3.txt
[lamitest@localhost ~]$

Donc on le résultat de ls et traiter par egrep (qui lui utilse des regex).
ls -l | egrep '^[a-z]+' ne fonctionne pas comment on vut puisque ls -l génére un logn affichage de genre
drwxrwxr-x 2 lamitest lamitest 4096 jan 18 18:30 test
-rw-rw-r-- 1 lamitest lamitest 81 jan 19 21:59 uuu

En ce cas la lettre chercher n'est pas la 1ère lettre du fichier ( test ou uuu) mais la 1ère lettre de la chaîne. Dans notre cas c'est la lettre l et la 2ème n'est pas trouvée puiqu'elle commence avec -

A voir les commandes cut, egrep, sed.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
1 avril 2006 à 09:40
Salut,

Essaie ça :
ls | grep -v [A-Z]
;-))
0
Je sais ce qu'est la fonction ls, et je connais aussi les redirection (tubes, <, <<, >, >>...) mais ce que je ne comprenais pas c'est pourquoi une expression rationnelle n'était pas prise en compte par ls.
Donc ls ne les prend pas en compte ? Pourtant j'avais essayé ls -l [0-9]* et ça m'affichait bien les fchiers commençant par un chiffre. Enfin je vais réessayer.

Je vais aussi essayer vos liens et vos commandes merci pour votre aide.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
1 avril 2006 à 14:24
Re,

Je sais ce qu'est la fonction ls Tu es sur?

mais ce que je ne comprenais pas c'est pourquoi une expression rationnelle n'était pas prise en compte Puisque ls n'est pas conçu pur ça.

man ls

ls, dir, vdir - Afficher le contenu d'un repertoire.

ls c'est une commande pour lister les fichiers et pas un interpreteur des regex

Qu'il prends en arguments certains motifs c'est grâce au shell et pas à la commande.

man bash
 Développement des noms de fichiers
       Apres  le  découpage des mots, et si l'option -f n'est pas
       indiquée, bash recherche dans chaque mot les caractères *,
       ?,  et  [.   Si  l'un d'eux apparaît, le mot est considéré
       comme un motif, et remplacé par  une  liste,  classée  par
       ordre  alphabétique,  des noms de fichiers correspondant à
       ce motif.  Si aucun nom de fichiers ne correspond,  et  si
       la variable allow_null_glob_expansion n'existe pas, le mot
       reste inchangé.  Si la variable existe, et si aucune  cor­
       respondance  n'est  trouvée, le mot est éliminé.  Quand un
       motif est utilisé pour créer des chemins d'accès, le  car­
       actère  ``.''   au  début  d'un nom, ou immédiatement à la
       suite d'un slash doit être explicitement mis en correspon­
       dance,  à  moins  que la variable shell glob_dot_filenames
       n'existe.  Dans tous les autres cas,  le  caractère  ``.''
       n'est  pas traité spécifiquement.  Le caractère slash doit
       toujours être mis en correspondance explicitement.

       Les caractères spéciaux ont les significations suivantes :

       *      Correspond  à n'importe quelle chaîne, y compris la
              chaîne vide.
       ?      Correspond à n'importe quel caractère.
       [...]  Correspond à l'un des  caractères  entre  crochets.
              n'importe  quel  caractère  situé  entre  les  deux
              bornes incluses.  Si le premier  caractère  suivant
              le  [  est un !  ou un ^ alors la correspondance se
              fait sur les caractères non-inclus.  Un - ou  un  ]
              peuvent  être mis en correspondance en les incluant
              en premier ou dernier caractère de l'ensemble.

Et le comportement de ls est bizarre
[lamitest@localhost rep_null]$ ls -1
7oo
a9aa
aaa
aUljjl
egd
ggg
Ujkj
Vdfs
[lamitest@localhost rep_null]$ ls -l [A-Z]*
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 egd
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 ggg
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 Ujkj
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 Vdfs
[lamitest@localhost rep_null]$ ls -l [a-z]*
-rw-rw-r--  1 lamitest lamitest 0 avr  1 14:08 a9aa
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 aaa
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 aUljjl
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 egd
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 ggg
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 Ujkj
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 Vdfs
[lamitest@localhost rep_null]$
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
1 avril 2006 à 14:55
Re,

voilà une réponse qui pourra te satisfaire

Affichage complet
[lamitest@localhost rep_null]$ ls -l
total 0
-rw-rw-r--  1 lamitest lamitest 0 avr  1 14:08 7oo
-rw-rw-r--  1 lamitest lamitest 0 avr  1 14:08 a9aa
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 aaa
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 aUljjl
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 egd
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 ggg
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 Ujkj
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 Vdfs

Affichage majuscules seulement
[lamitest@localhost rep_null]$ ls -l -I '[a-z0-9]*'
total 0
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 Ujkj
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 Vdfs
[lamitest@localhost rep_null]$
Affichage minuscules seulement
[lamitest@localhost rep_null]$ ls -l -I '[A-Z0-9]*'
total 0
-rw-rw-r--  1 lamitest lamitest 0 avr  1 14:08 a9aa
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 aaa
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 aUljjl
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 egd
-rw-rw-r--  1 lamitest lamitest 0 avr  1 08:50 ggg
[lamitest@localhost rep_null]$
lami20j

P.S. N'oublie pas que les motifs représent l'interpretation de shell pour les noms de fichiers

L'option I du ls permet d'ignorer le motif (l'expansion des noms des fichiers pas shell et pas les regex de ls - On n'a pas de regex pour ls)

On l'appelle globalisation, regex c'est totalement different.

* veut dire n'importe quel chaîne y compris la chaîne vide

En regex * c'est un quantificateur qui veut dire zéro fois, une fois ou autant des fois que tu peux.

J'espère que j'ai réussi à te faire comprendre. Merci
0
Merci ça marche cette fois-ci.
J'ai pas tout compris, mais c'est pas grave je finirai bien par comprendre un jour !
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
7 avril 2006 à 19:46
Salut,

mais c'est pas grave je finirai bien par comprendre un jour

En ce cas je ne m'inquiète pas.

Bonne continuation.

lami20j
0
Bonjour,

Ce sujet date un peu, et peut-être tout le monde a trouvé la réponse qu'il cherchait dans son coin.
Si le comportement de " ls -l [a-z]*" tel que rapporté paraît bizarre, alors il faudrait voir s'il renvoie le même résultat que :
ls -l [abcdefghijklmnopqrstuvwxyz]*
Si on a le même résultat, il faudrait s'orienter vers un problème autre (un bug dans le shell ?)
Si avec la dernière commande on obtient seulement les noms qui commencent avec une minuscule, alors c'est l'ordre lexicographique qui est en cause. C'est-à-dire que dans la plage [a-z] il y a d'autres lettres que seulement les minuscules.
0
C'est beaucoup plus simple.

ls -l [a-z]* liste les fichiers :
- Dont la première lettre est comprise entre a et z ;
- Dont le nom contient ensuite un nombre quelconque (y compris zéro) de caractères quelconques.
0
dubcek Messages postés 18748 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 26 septembre 2024 5 618
29 sept. 2011 à 15:52
hello
on peut choisir si le shell différencie majscules et minuscules
$ ls
A  B  C  a  b  c
$ 
$ ls [a-z]
a  A  b  B  c  C
$ 
$ ls [A-Z]
A  b  B  c  C
$ 
$ export LC_COLLATE=C
$ 
$ ls [a-z]
a  b  c
$ ls [A-Z]
A  B  C
$ 
0