[bash] exp rationnelles et variable

bobo25 -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  2. bobo25
     
    ok merci pour ton aide je vais essayer ça :-)
    0
  3. bobo25
     
    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
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. bobo25
     
    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
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Essaie ça :
    ls | grep -v [A-Z]
    ;-))
    0
  9. bobo25
     
    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
  10. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  11. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  12. bobo25
     
    Merci ça marche cette fois-ci.
    J'ai pas tout compris, mais c'est pas grave je finirai bien par comprendre un jour !
    0
  13. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  14. Sparc
     
    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
    1. gm
       
      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
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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