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 :

Questions à réaliser en une seule commande


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut Questions à réaliser en une seule commande
    Bonjour,

    je suis en train de refaire un partiel que j'avais raté

    Et j'aimerais votre aide pour avoir la correction de cet exo.


    1 - Ecrire dans fichier.txt les informations détaillées des fichiers dont les désignations se trouve dans le fichier liste-nom.txt (une désignation par ligne). Si fichier.txt existe déjà son contenu est écrasé.


    2- Afficher le nom du fichier ordinaire ayant la plus grande taille dans le répertoire courant

    3- afficher le nombre d'élément du répertoire courant caché ou non dont le nom contient au moins le caractère point


    4- Expliquer ce que fait la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep '^ab\{2\}.*\..*c$' abb*.*c
    Je dirais que cela regarde le contenu de tous les fichier commençant par abb et ayant un c en fin d'extention. Il affiche alors le contenu des lignes de ces fichiers commençant par abbb suivi d'une chaîne de caractère quelconque se terminant par la lettre c en fin de ligne.
    Je suis pas sur de ma réponse j'aimerais donc savoir ce que vous en pensez ! Bien entendu vous allez me dire que je n'ai qu'à tester^^Mais en exam on a pas de pc pour tester je préfère donc ne pas céder à la tentation





    En ce qui concerne les questions 1,2,3. Vous allez me dire c'est très facile un petit script qui fait chacun de ces cas c'est vite fait. Et vous avez raison !
    Seulement je dois rajouter la consigne qui casse tout; il faut réaliser ces taches en une seule ligne de commande. Il va donc falloir jouer avec les pipes | et les opérateurs d'indirection en général. Mais là pour le coup c'est pas du tout mon fort et j'aimerais bien avoir une correction fiable ^^


    Merci à vous !

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    1 - Ecrire dans fichier.txt les informations détaillées des fichiers dont les désignations se trouve dans le fichier liste-nom.txt (une désignation par ligne). Si fichier.txt existe déjà son contenu est écrasé.
    Bon déjà, ils sont gentils, ils ne nous disent pas ce qu'ils entendent par "informations détaillées". Je déteste les spécifications aussi peu précise même si je me doute qu'ils s'attendent à quelque chose du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat liste-nom.txt|xargs ls -l > fichier.txt
    Maintenant, j'ai agis avec la "mentalité" de certains enseignants pour qui "infos détaillées sur un fichier en shell" == ls -l. Il vaut mieux savoir exactement les infos que l'on souhaite stocker et passer par une commande prévue à cet effet : la commande stat.

    Un peu de lecture utile à ce sujet : http://ineumann.developpez.com/tutor...tiques/#LIII-A

    Je rappel ceci :

    1) > va rediriger la sortie cat liste-nom.txt|xargs ls -l dans fichier.txt en écrasant son contenu si le fichier existe déjà (>> ajouterais cette sortie à la fin du fichier s'il existe déjà).
    2) > est un raccourci de 1> avec 1 qui désigne la sortie standard (stdout), il y a d'autres flux comme 2 qui désigne stderr (la sortie d'erreur standard).
    3) xargs va exécuter ls -l sur chaque ligne renvoyées par la commande cat liste-nom.txt.
    4) à la place de ls -l vous pouvez utiliser stat encore une fois comme je l'ai dit précédemment (mais ça suppose de savoir ce que l'on veux précisément comme "informations détaillées").

    Une autre solution pour lire le contenu d'un fichier en Bash sans passer par des commandes superflues :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read -r; do stat -c "%A" "$REPLY"; done < liste-nom.txt > fichier.txt
    Toutefois, celle-ci ne remplis pas les exigences de votre consigne.

    Cordialement,
    Idriss

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Salut et merci pour votre réponse.

    Oui je confirme pendant tout mon premier semestre j'ai toujours utilisé ls -l pour les infos détaillé.

    En revanche, je ne connaissais pas la commande xargs, on ne l'a même jamais évoqué en cours, je pense donc qu'il faut utiliser une autre solution.


    Ce que moi j'aurais tenté de faire (surement à tort):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -l `grep '^.*\..*$' liste-nom.txt` > fichier.txt
    ls -l pour les information détaillé et entre backquote je récupère le résultat du grep pour l'utiliser dans mon ls -l

    Je récupère des lignes commençant par une chaine quelconque suivi d'un point et se terminant par une chaine quelconque (donc à priori un nom de fichier que je passe au ls -l)


    2) > est un raccourci de 1> avec 1 qui désigne la sortie standard (stdout), il y a d'autres flux comme 2 qui désigne stderr (la sortie d'erreur standard).
    Voilà quelque chose que l'on ne m'avait jamais expliqué en cours, pour moi il n'y avait que > et 2>
    Maintenant je sais que > est un raccourci de 2> ça apparaît déjà plus logique

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Re bonjour.

    Citation Envoyé par Amnael Voir le message
    Maintenant je sais que > est un raccourci de 2> ça apparaît déjà plus logique
    Non attention, c'est un raccourci de 1> (fin disons que 1 est le canal/flux "par défaut").

    Citation Envoyé par Amnael Voir le message
    Ce que moi j'aurais tenté de faire[...]
    Je ne comprends pas trop l'utilité de grep pour ce cas, à moins que vous ayez d'autres contraintes qui exigent de filtrer certaines lignes du fichier txt contenant le nom des fichiers dont on veut le détail.

    Passons à la suite :

    2- Afficher le nom du fichier ordinaire ayant la plus grande taille dans le répertoire courant
    Si je dois utiliser le moins de commandes possible, j'opterais pour awk :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -l|awk '($8 != ""){lst[$5"_"$8]=$8} END {n=asorti(lst, sorted); print lst[sorted[n]]}'
    Attention, vérifier l'ordre des colonnes pour ls -l :
    $5 = la taille
    $8 = le nom du fichier
    Numéros de colonnes à adapter si besoin.

    Moult autres solutions sont possibles, par exemple, un peu plus lourd :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -1|xargs -Ifichier stat -c "%s;fichier" fichier|sort -r|head -n1|cut -d";" -f2
    ls -1 : afficher chaque fichier sur une ligne
    stat -c "%s" : afficher la taille en bytes
    sort -r : tri décroissant
    head -n1 : n'afficher que la première ligne
    cut -d ";" -f2 : découpe sur le séparateur ";" et affiche le second élément

    3- afficher le nombre d'élément du répertoire courant caché ou non dont le nom contient au moins le caractère point
    L'option -a va afficher les fichiers cachés.
    L'option -1 pour afficher un seul fichier par ligne.
    grep "\." les noms qui contiennent "." (ça peut être pour l'extension, parce que c'est un fichier caché ou pour d'autres raisons...).
    wc -l compte le nombre de lignes...

    Autre possibilité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in *; do [[ $(basename $i) =~ \. ]] && basename $i; done|wc -l
    La première solution me semble davantage conforme aux consignes.

    Citation Envoyé par Amnael Voir le message
    4- Expliquer ce que fait la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep '^ab\{2\}.*\..*c$' abb*.*c
    Je dirais que cela regarde le contenu de tous les fichiers commençant par abb et ayant un c en fin d'extention. Il affiche alors le contenu des lignes de ces fichiers commençant par abbb suivi d'une chaîne de caractère quelconque se terminant par la lettre c en fin de ligne.
    Vous y êtes presque :

    Je dirais que cela regarde le contenu de tous les fichier commençant par abb et ayant un c en fin d'extention
    Je chipote mais je dirais plutôt "ayant un 'c' en fin de nom" (le shell se fiche des extensions et en l'occurrence un fichier qui se nommerait simplement "abbc" serait parsé par grep avec cette expression).

    Il affiche alors le contenu des lignes de ces fichiers commençant par abbb

    ^ab\{2\} => "commençant par abb" plutôt (ce qui aurait été plus simple à écrire dans l'expression rationnelle d'ailleurs).

    suivi d'une chaîne de caractère quelconque
    Je préciserais de taille quelconque (pouvant même être de 0 caractères).

    se terminant par la lettre c en fin de ligne.
    Oui mais il manque un bout avant

    \..*c => \. donc un carractère ".", encore .* (donc chaine quelconque avec taille quelconque) et enfin "c".

    Cordialement,
    Idriss

  5. #5
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    J'avais fait l'impasse sur cette remarque :

    Citation Envoyé par Amnael Voir le message
    En revanche, je ne connaissais pas la commande xargs, on ne l'a même jamais évoqué en cours, je pense donc qu'il faut utiliser une autre solution.
    Pour un truc aussi minim que xargs, je ne pense pas, à moins que ça ait été explicitement interdit (du genre "seul les commandes vues en cours sont autorisées" ce qui serait légèrement bête de la part de l'enseignant m'enfin bon là n'est pas le débat)... n'hésites pas à leur poser la question (en citant xargs ou awk par exemple) avant le jour de ton partiel et tu verra bien.

    En tout cas, il ne faut jamais se limiter à ce qui est enseigné en cours et toujours être pragmatique

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Merci pour toutes ces explications. J'espère ne plus avoir d'autres soucis


    Pour le grep, disons que la consigne dit qu'il y a un nom de fichier par ligne donc c'est vrai qu'il est inutile ici. Mais si ça n'avait pas été le cas, il aurait pu y avoir un nom de fichier sur une ligne et un truc complètement à part sur une autre ligne. Mais bon je chipote là pour un exam de rattrapage je vais pas me casser la tête aussi loin vous avez raison cat est tout indiqué

  7. #7
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bah dans ce cas, c'est pas en testant le fait qu'il y ait un "." dans le nom du fichier qui va te garantir que s'en est un
    Un fichier n'a pas nécessairement d'extension sous Unix (souvent il n'en a pas, les extensions ne servent qu'aux programmes pas à l'OS ni au shell).
    Un répertoire quant à lui peut aussi être nommé avec un "." et une ligne peut très bien contenir un "." sans qu'elle corresponde à un nom de fichier.

    Une façon d'être certain que seuls les fichiers soient traités :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat liste-nom.txt|xargs -I{} bash -c "[[ -f {} ]] && ls -l {}" > fichier.txt
    Si tu veux prendre en compte les fichiers et les répertoires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat liste-nom.txt|xargs -I{} bash -c "[[ -e {} ]] && ls -l {}" > fichier.txt
    Après c'est pas utile, la consigne dit bien "dont les désignations se trouvent dans liste-nom.txt (une désignation par ligne)"

    Idriss

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

Discussions similaires

  1. utiliser une seule commande pour créer plusieur fichier
    Par waldomania dans le forum Administration système
    Réponses: 1
    Dernier message: 13/12/2009, 16h43
  2. créer cette matrice avec une seule commande
    Par Medoou dans le forum MATLAB
    Réponses: 8
    Dernier message: 15/07/2009, 08h17
  3. Réponses: 4
    Dernier message: 29/06/2009, 11h46
  4. [LabVIEW 8.6]Deux boutons pour une seule commande.
    Par bobico dans le forum LabVIEW
    Réponses: 4
    Dernier message: 08/06/2009, 16h03
  5. Création de plusieurs FK en une seule commande ALTER
    Par Lawyer666 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/06/2007, 19h01

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