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

Shell et commandes GNU Discussion :

[Red Hat] Commande et Script Shell


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Points : 188
    Points
    188
    Par défaut [Red Hat] Commande et Script Shell
    Bonjour,

    Je cherche dans un répertoire à renvoyer le nom du fichier qui arrive en dernier (dans l'ordre alphabétique).

    Soit 2 fichiers a.out et b.out dans le répertoire /rep


    La commande

    ls /rep/?.out | sort -r | head -n1

    me renvoie bien le fichier b.out


    là où j'ai un problème c'est quand je le fais dans un script shell recuperer_nom_fichier_recent.sh

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/bin/sh
    # $1 : Répertoire
    # $2 : Nom fichier wildcard
     
    if ls $1/$2 1> /dev/null 2>&1; then
        ls $1/$2 | sort -r | head -n1
    else
        printf "\x00"
    fi
    si je fais ./recuperer_nom_fichier_recent.sh /rep ?.out


    Le résultat est a.out

    Je ne comprends pas du tout quel est le problème

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Au lieu de faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls /rep/?.out | sort -r | head -n1
    tu pourrais simplement faire comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls /rep/?.out | tail -1
    Cela reviendrait au même

    Par contre tu va avoir deux problème avec ces deux commandes :
    - ça ne fait pas de différence entre les fichiers et les répertoires
    - ça ne tient pas compte de la casse (les minuscules seront toujours après les majuscules)

    Sinon pour ton script shell j'ai deux question :
    - as-tu réellement une ligne vide au début ?
    - aurais-tu un exemple d'appel au script (c'est surtout pour la variable $2)

    A mon avis, un find sera mieux à utiliser qu'un ls.

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    On n'utilise pas ls dans un script !
    Comme on n'utilise pas ls dans un script, il faut plutôt utiliser find.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /rep -type f | sort | tail -n 1
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par ecatomb Voir le message
    Au lieu de faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls /rep/?.out | sort -r | head -n1
    tu pourrais simplement faire comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls /rep/?.out | tail -1
    Cela reviendrait au même

    Par contre tu va avoir deux problème avec ces deux commandes :
    - ça ne fait pas de différence entre les fichiers et les répertoires Pas grave une interface de dépôt ne me transfert que des fichiers et le contrôle se fait à son niveau
    - ça ne tient pas compte de la casse (les minuscules seront toujours après les majuscules) En faite les fichiers sont de la forme file_yyyymmdd.out, l'interface de dépôt contrôle que les fichiers sont générés avec le bon nom.

    Sinon pour ton script shell j'ai deux question :
    - as-tu réellement une ligne vide au début ? Oui, c'est mal
    - aurais-tu un exemple d'appel au script (c'est surtout pour la variable $2) ./recuperer_nom_fichier_recent.sh /rep ?.out

    A mon avis, un find sera mieux à utiliser qu'un ls.

  5. #5
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour


    Comme on n'utilise pas ls dans un script, il faut plutôt utiliser find.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /rep -type f | sort | tail -n 1
    J'ai modifier le script de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/sh
    # $1 : Répertoire
    # $2 : Nom fichier wildcard
    if ls $1/$2 1> /dev/null 2>&1; then
        find $1/$2 -type f | sort | tail -n1
    else
        printf "\x00"
    fi
    c'est toujours a.out et non b.out qui est renvoyé


    Exemple sur ma machine

    $ll


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    -rw-r--r-- 1 bods bods   0 Jul 31 07:18 a.out
    -rw-r--r-- 1 bods bods   0 Jul 31 10:44 b.out
    -rwxrw-r-- 1 bods bods 169 Jul  7 15:00 fichier_existe_wildcard.sh
    -rwxrw-r-- 1 bods bods  92 Jul 30 17:11 lance_job.sh
    -rwxrw-r-- 1 bods bods 159 Jul 31 10:45 recuperer_nom_fichier_recent.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [bods@bods shell][bods@bods shell]$ find /ETL/R4G/application/lib/script/shell/?.out -type f | sort | tail -n1
    /ETL/R4G/application/lib/script/shell/b.out

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [bods@bods shell]$ ./recuperer_nom_fichier_recent.sh /ETL/R4G/application/lib/script/shell ?.out
    /ETL/R4G/application/lib/script/shell/a.out

    Je suis largué.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Bonjour,
    Ce que tu passes réellement à ton script c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./recuperer_nom_fichier_recent.sh /ETL/R4G/application/lib/script/shell a.out  b.out
    Et là, comme tu peux le voir, $2 est a.out
    La bonne syntaxe serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./recuperer_nom_fichier_recent.sh /ETL/R4G/application/lib/script/shell \?.out
    Mais après, il faut que ton script sache interpréter le caractère '?' en tant que meta-caractère car ici, ce '\?' est devenue un caractère à part entière...
    Cordialement.

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Dans l'ordre:

    • Tu dis avoir modifié le script mais je vois toujours un "ls". C'est pas bien.
    • Tu sembles te tromper sur le comportement de "if". Il récupère le code erreur et non la sortie standard. Cette ligne ne teste pas s'il y a un fichier qui sort du "ls" mais si ls s'est exécuté correctement. Ce qui sera probablement toujours vrai.
    • Est-ce que tu confonds les wildcards "?" (1 caractère) et "*" (autant de caractères qu'on veut) ?
    • find ne s'utilise généralement pas comme tu fais. On indique d'abord le dossier dans lequel chercher, puis, on indique les critères de recherche. Ici:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      find /rep -type f -name "*.out" | sort |tail -1
    • Ta commande find a bien fonctionné. Mais dans le script, ça ne peut pas marcher car bash (ou autre interpréteur de commande) interprète "?" avant le find. Donc tes paramètres ne sont pas ceux que tu crois.
      D'où la technique expliquée ci-dessus.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Essaie avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./recuperer_nom_fichier_recent.sh /ETL/R4G/application/lib/script/shell "?.out"
    Sinon ton script est à améliorer
    - Comme indiqué par @Flodelarab, pas de ls dedans (ça évitera d'avoir des bugs bizarres)
    - J'ai modifierais un peu ta commande find comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find "$1" -name "$2" -type f -maxdepth 1 | sort -f | tail -n1
    Ca te permettra d'ignorer la casse lors de ton tri et de gérer les cas avec des espaces dans tes répertoires ou fichiers (par sécurité)

Discussions similaires

  1. Red Hat : commande setup (setuptool) incomplète
    Par 84mickael dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 07/03/2008, 16h30
  2. Réponses: 2
    Dernier message: 27/02/2006, 15h59
  3. Programmation Shell avec Red Hat Calcul de moyenne
    Par jcpoulard dans le forum Linux
    Réponses: 3
    Dernier message: 22/02/2006, 22h08
  4. [Serveur] executer script php sur red hat
    Par jj del amorozo dans le forum Apache
    Réponses: 6
    Dernier message: 08/02/2006, 15h29

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