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

Programmation et administration système Perl Discussion :

ls des liens symboliques


Sujet :

Programmation et administration système Perl

  1. #1
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut ls des liens symboliques
    Bonjour.

    J'ai un test à base de =~ qui ne fonctionne pas sans que je comprenne pourquoi.

    etienne@samba-eu:~$ ls -l /var/run/usbmount/
    total 0
    lrwxrwxrwx 1 root root 11 2006-03-08 16:05 ST316021_2A_1 -> /media/usb1
    lrwxrwxrwx 1 root root 11 2006-03-08 15:33 ST316081_2A_1 -> /media/usb0
    c'est ce que va contenir @listing

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @listing=`/bin/ls -l $USBVAR`;
     
    for ($i=0; $i <= $#listing ; $i++) {
            @ligne=split(/ /,$listing[$i]);
                    print "$ligne[8] == $NEEDEDSN";
                    if ( $ligne[8] =~ /"$NEEDEDSN"/ ){ print "youpi"; }
    }
    $NEEDEDSN contient ST316081_2A_1

    Quand je lance mon script ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    etienne@samba-eu:~/shelltest/usbmount$ ./getMOUNT.pl
     == ST316081_2A_1
    ST316021_2A_1 == ST316081_2A_1
    ST316081_2A_1 == ST316081_2A_1
    Doit y avoir une feinte que j'ai pas comprise.

    Merci d'avance.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Hello Ggnore

    Tu m'as tellement aidé en shell script que je mériterais un gros blâme si je ne t'aidais pas !
    Alors, déjà, tu pars sur un mauvais calacul. Pour lister les éléments d'un répertoire, point n'est besoi nde recourir à ls. La FAQ te dit comment lister un répertoire de manière propre : http://perl.developpez.com/faq/?page...nC1#sectionC16
    Avec ça, tu peux remplir facilement ton tableau avec le nom des fichiers puis travailler dessus.


    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184

  4. #4
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Héhé
    Merci pour ton aide.

    Le coup du ls est important car je liste des liens symboliques, et il faut indiquer l'option -l à ls pour que cela s'affiche vers quel fichier 'pointe' le lien.

    Je vais jeter un coup d'oeil à ton lien ceci dit.

    Mon problème venait d'un \n qui trainait dans une variable.
    Un coup de chomp et ça repart

    merci.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  5. #5
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Arf merci, je débute à mooooort sous perl.
    Ceci dit l'erreur était dans l'énoncé mais pas dans le script, donc ça va
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par ggnore
    Héhé
    Merci pour ton aide.

    Le coup du ls est important car je liste des liens symboliques, et il faut indiquer l'option -l à ls pour que cela s'affiche vers quel fichier 'pointe' le lien.

    Je vais jeter un coup d'oeil à ton lien ceci dit.

    Mon problème venait d'un \n qui trainait dans une variable.
    Un coup de chomp et ça repart

    merci.
    NB : Je ne sais pas si ici ça peut t'intéresser, mais tu peux obtenir une fonctionnalité équivalente au '-l' de ls en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $dir = "/chemin/vers/mon/repertoire";
    opendir DH, $dir;
    my @files = map { -l "$dir/$_" ? $_ : readlink "$dir/$_" } (readdir DH);
    La clé ici est l'usage de '-l' pour tester s'il s'agit d'un lien symbolique, puis de readlink pour connaître le véritable fichier.

    --
    Jedaï

  7. #7
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Citation Envoyé par Jedai
    Citation Envoyé par ggnore
    Héhé
    Merci pour ton aide.

    Le coup du ls est important car je liste des liens symboliques, et il faut indiquer l'option -l à ls pour que cela s'affiche vers quel fichier 'pointe' le lien.

    Je vais jeter un coup d'oeil à ton lien ceci dit.

    Mon problème venait d'un \n qui trainait dans une variable.
    Un coup de chomp et ça repart

    merci.
    NB : Je ne sais pas si ici ça peut t'intéresser, mais tu peux obtenir une fonctionnalité équivalente au '-l' de ls en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $dir = "/chemin/vers/mon/repertoire";
    opendir DH, $dir;
    my @files = map { -l "$dir/$_" ? $_ : readlink "$dir/$_" } (readdir DH);
    La clé ici est l'usage de '-l' pour tester s'il s'agit d'un lien symbolique, puis de readlink pour connaître le véritable fichier.

    --
    Jedaï
    C'est mal comme ça d'utiliser ls ?
    parce que ce script ne sera utilisé que sous linux, je n'ai aucune vue sur l'international. Ce script n'est que pour une machine.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Non, ce n'est pas vraiment 'mal', c'est pour ça que j'ai mis 'je ne sais pas si ça peut t'intéresser ici'. Néanmoins, tu ne peux nier que ton emploi de 'ls' alourdit le script pour pas grand chose (avec la solution pure perl, tu n'as plus besoin de faire du parsing et tu peux en profiter pour donner des noms plus clairs que le 9ème ou le 11ème champ d'une ligne renvoyée par ls -l).
    De plus les performances sont bien sûr incomparable entre un appel système et une création de processus, bien que ce n'ait ici pas la moindre importance.

    C'est vraiment ton choix, mais pour ma part j'essaie de limiter l'usage d'applications externes tant qu'il y a une solution Perl aussi simple (et surtout lorsqu'elle est plus simple et élégante comme ici).

    --
    Jedaï

  9. #9
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Citation Envoyé par Jedai
    Non, ce n'est pas vraiment 'mal', c'est pour ça que j'ai mis 'je ne sais pas si ça peut t'intéresser ici'. Néanmoins, tu ne peux nier que ton emploi de 'ls' alourdit le script pour pas grand chose (avec la solution pure perl, tu n'as plus besoin de faire du parsing et tu peux en profiter pour donner des noms plus clairs que le 9ème ou le 11ème champ d'une ligne renvoyée par ls -l).
    De plus les performances sont bien sûr incomparable entre un appel système et une création de processus, bien que ce n'ait ici pas la moindre importance.

    C'est vraiment ton choix, mais pour ma part j'essaie de limiter l'usage d'applications externes tant qu'il y a une solution Perl aussi simple (et surtout lorsqu'elle est plus simple et élégante comme ici).

    --
    Jedaï
    Ok ta justification m'a l'air tout à fait fondée, je vais me pencher sur ta solution. Merci d'avoir cherché à me convaincre
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  10. #10
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #!/usr/bin/perl
    $SNUSBHDFILE="/home/etienne/shelltest/usbmount/SN.txt";
    $USBVAR="/var/run/usbmount/";
     
    $NEEDEDSN=`./getSN.pl`;
    chomp($NEEDEDSN);
     
    my $dir = "$USBVAR";
    opendir DH, $dir;
    my @files = map { -l "$dir/$_" ? $_ : readlink "$dir/$_" } (readdir DH);
     
    for ($i=0; $i <= $#files ; $i++) {
            ($hd,$mount,$plus)=split(/ /,$files[$i]);
            print ">$hd-$mount-$plus";
    }
    et le résultat :
    >-->-->ST316081_2A_1-->ST316021_2A_1--
    alors qu'autre chose que ST316081_2A_1 devrait apparaître !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     ls -l /var/run/usbmount/
    total 0
    lrwxrwxrwx  1 root root 11 2006-03-08 16:05 ST316021_2A_1 -> /media/usb1
    lrwxrwxrwx  1 root root 11 2006-03-08 15:33 ST316081_2A_1 -> /media/usb0
    Je n'accède pas au lien, mais seulement au nom du fichier
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  11. #11
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    etienne@samba-eu:~/shelltest/usbmount$ readlink /var/run/usbmount/ST316081_2A_1
    /media/usb0
    etienne@samba-eu:~/shelltest/usbmount$ cat test.pl
    #!/usr/bin/perl
    readlink ("/var/run/usbmount/ST316081_2A_1");
    etienne@samba-eu:~/shelltest/usbmount$ ./test.pl
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  12. #12
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/usr/bin/perl
    $SNUSBHDFILE="/home/etienne/shelltest/usbmount/SN.txt";
     
    $NEEDEDSN=`./getSN.pl`;
    chomp($NEEDEDSN);
     
    my $USBVARDIR = "/var/run/usbmount/";
    opendir DH, $USBVARDIR or die "impossible d'ouvrir le repertoire $USBVARDIR";
     
    @liste=readdir(DH);
    foreach $f (@liste) {
            next if $f eq "." or $f eq "..";
            if (-l "$USBVARDIR/$f") {
                    if ( $f =~ /$NEEDEDSN/ ) {
                            my $result=readlink "$USBVARDIR/$f";
                            print $result;
                    }
            }
    }
    Ok j'étais un peu allé vite en besogne.
    Merci pour tout.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [eZ Publish 5] impossible de créer des liens symboliques
    Par spawn_nico dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 05/07/2013, 13h02
  2. [Utilisation] Gestion des liens symboliques
    Par ®om dans le forum Subversion
    Réponses: 4
    Dernier message: 03/09/2009, 12h47
  3. Réponses: 1
    Dernier message: 03/07/2007, 18h23
  4. Changement des droits d'un lien symbolique
    Par Trebor dans le forum Administration système
    Réponses: 8
    Dernier message: 21/01/2007, 21h00
  5. Comment crée des liens symboliques
    Par HNT dans le forum Administration système
    Réponses: 1
    Dernier message: 07/01/2006, 16h43

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