Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 21/09/2010, à 13:59

Watael

Re : [Mini Challenge/TP] Comprendre l’expansion de nom

=> apprendre à utiliser
printf
et les nouvelles fonctions de bash4 : **

ce serait aussi simple ?

ok; mais alors c'est un strict bashism
et n'est pas portable, si/oui ?

Dernière modification par Watael (Le 21/09/2010, à 14:02)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#27 Le 21/09/2010, à 14:28

ehmicky

Re : [Mini Challenge/TP] Comprendre l’expansion de nom

Merci Watael ^^
Nouvel envoi de réponse... là je pourrai pas faire plus court, une ligne de commande !

Dernière modification par ehmicky (Le 21/09/2010, à 14:31)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#28 Le 22/09/2010, à 10:38

Totor

Re : [Mini Challenge/TP] Comprendre l’expansion de nom

ehmicky a écrit :

Merci Watael ^^
Nouvel envoi de réponse... là je pourrai pas faire plus court, une ligne de commande !

Voilà pourquoi je souhaité que les réponses (et remarques/demandes mais je n'ai pas été suffisamment explicite) soient effectuées par mail hmm

Bon, les solutions proposées au prochain post...

Dernière modification par Totor (Le 22/09/2010, à 10:38)


-- Lucid Lynx --

Hors ligne

#29 Le 22/09/2010, à 11:00

Totor

Re : [Mini Challenge/TP] Comprendre l’expansion de nom

Les solutions proposées :

1. ehmicky :
Parmi toutes celles reçues, je retiendrai l'avant dernière car tu as été influencé pour la dernière (désolé) :

shopt -s dotglob
rechercher() {
    for fich in "$1"/* ; do
        [[ ! -L $fich && -d $fich ]] && rechercher "$fich"
    done
    [[ -z ${1##*/bin} ]] && echo "$1"
}
rechercher /usr

l'idée du récursif est bonne mais il y a une subtilité non prise en compte dans ce code : l'expansion des noms de dossier.
si tu avais mis "$1"/*/, cela t'aurait évité de vérifier s'il s'agit d'un dossier.

2. AnsuzPeorth :
Alors là, je dois avoué que je n'y avais pas pensé :

printf '%s\n' /usr/{bin/,*/{bin/,*/{bin/,*/bin/}}}

le seul "hic", c'est que cela se base sur une arborescence figée.

3. sputnick :
Dans le même principe (compatible bash < 4), sputnick a proposé ceci :

printf '%s\n' /usr/*/*/*/*/*bin/ /usr/*/*/*/*bin/ /usr/*/*/*bin/ /usr/*bin/

Bien évidement, la solution "sans boucle ni utilisation xargs" n'est possible qu'avec bash >=4
Solution proposée en premier lieu par sputnick puis par ehmicky  (suite remarque de Watael) et postmortem :

shopt -s globstar
printf "%s\n" /usr/**/bin/

Alors, pour répondre à Watael :
Le but initial était de faire comprendre que l'expansion est réalisée par bash et non par les instructions/commandes ls ou find (avec comme détail l'ajout du / pour ne sélectionner que les dossiers). Le fait d'utiliser printf et ** pour ne pas faire de boucle n'était qu'optionnel.
J'aurais également pu introduire les méta caractère ?, ^ (ou !) mais également les formes avancées : [!?@+*]( patterns )

J'attendais donc une solution proche de celle d'ehmicky :

listebin()
{
   set -- "${1%/}"
   for dossier in "$1"/*/
   do
     listebin "${dossier}"
   done
   [[ "$1" == */bin ]] && echo "$1"
}

shopt -s nullglob
listebin "/usr"

edit : je viens de découvrir la réponse de postmortem (noyée dans mes spams hmm). je l'ai rajouté à la liste des personnes ayant donné la solution printf... (même si je pense qu'il a été également influencé par Watael ^^)

Dernière modification par Totor (Le 22/09/2010, à 13:22)


-- Lucid Lynx --

Hors ligne

#30 Le 22/09/2010, à 11:43

Postmortem

Re : [Mini Challenge/TP] Comprendre l’expansion de nom

Bonjour,
Une petite question : pourquoi le set -- "${1%/}" ?


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#31 Le 22/09/2010, à 12:16

AnsuzPeorth

Re : [Mini Challenge/TP] Comprendre l’expansion de nom

Alors là, je dois avoué que je n'y avais pas pensé :

Hummm, tu m'étonnes là, ca ne serait pas juste de la modestie ?

Pour faire la même chose que j'ai proposé, mais en plus propre (je voulais pas t'envoyer un mail alors que ce n'était pas une solution viable):

printf '%s\n' /usr/{,*/,*/*/,*/*/*/}bin/

Bien évidement, la solution "sans boucle ni utilisation xargs" n'est possible qu'avec bash >=4

Voilà pourquoi faut que j'arrête ces challenges, je passe un temps fou pour essayer de faire des choses irréalisables ...(suis tjrs en bash3)

Dernière modification par AnsuzPeorth (Le 22/09/2010, à 12:24)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#32 Le 22/09/2010, à 12:58

Totor

Re : [Mini Challenge/TP] Comprendre l’expansion de nom

Postmortem a écrit :

Bonjour,
Une petite question : pourquoi le set -- "${1%/}" ?

1. A cause de ceci : [[ "$1" == */bin ]] && echo "$1"
car le dossier donné en argument peut ne pas être donné avec le dernier slash.

Mais l'on pourrait évidemment faire autrement :
- supprimer le set -- "${1%/}"
- remplacer [[ "$1" == */bin ]] par [[ "${1%/}" == */bin ]]

2. Mais j'ai préféré l'utilisation de set pour éviter que les noms de dossiers contiennent 2 slash consécutifs (le 2nd arrivant via l'expansion de "$1"/*/). Ce qui n'est pas gênant en soit pour la lecture des dossiers mais juste moins "esthétique" à l'affichage (à moins bien sur de supprimer par la suite les doubles slash).

Dernière modification par Totor (Le 22/09/2010, à 13:03)


-- Lucid Lynx --

Hors ligne

#33 Le 22/09/2010, à 13:03

Totor

Re : [Mini Challenge/TP] Comprendre l’expansion de nom

AnsuzPeorth a écrit :

Hummm, tu m'étonnes là, ca ne serait pas juste de la modestie ?

non vraiment, je n'ai même pas cherché puisque je connaissais le **

AnsuzPeorth a écrit :

Voilà pourquoi faut que j'arrête ces challenges, je passe un temps fou pour essayer de faire des choses irréalisables ...(suis tjrs en bash3)

est-ce du temps de perdu ?


-- Lucid Lynx --

Hors ligne

#34 Le 22/09/2010, à 13:50

Postmortem

Re : [Mini Challenge/TP] Comprendre l’expansion de nom

Merci Totor !
Encore une question, toujours au sujet du set -- "${1%/}" ! C'est le -- qui m'embête. Ça indique la fin des options, non ?? Ça serait donc pour prendre en compte le fait qu'un dossier pourrait commencer par - ?

Totor a écrit :

edit : je viens de découvrir la réponse de postmortem (noyée dans mes spams hmm). je l'ai rajouté à la liste des personnes ayant donné la solution printf... (même si je pense qu'il a été également influencé par Watael ^^)

J'avais bien lu le coup des 2 * dans le man bash. Mais j'avais essayé vite fait et ça ne marchait pas. Et donc en effet, en lisant la réponse de Watael, je me suis dit que ça DEVAIT marcher. Et donc en relisant man bash, j'en suis arrivé sur les "options shopt". Et donc, merci aussi Watael !

Dernière modification par Postmortem (Le 22/09/2010, à 13:55)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#35 Le 22/09/2010, à 14:06

Totor

Re : [Mini Challenge/TP] Comprendre l’expansion de nom

oui, ça indique la fin des options.
et oui, un dossier peut commencer par un "-" mais je ne l'ai pas fait dans cet optique... simplement par pure habitude

edit : pour créer un tel dossier :
mkdir -- -dossier

Dernière modification par Totor (Le 22/09/2010, à 14:07)


-- Lucid Lynx --

Hors ligne

#36 Le 22/09/2010, à 14:11

Postmortem

Re : [Mini Challenge/TP] Comprendre l’expansion de nom

Re-re-re Merci !
Je sais, suis reloud avec mes questions mais j'aime bien comprendre TOUT ce que je tape !
Mais je vous jure, des fois je me retiens pour pas pourrir vos sujets de mes questions ! tongue


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#37 Le 22/09/2010, à 14:29

ehmicky

Re : [Mini Challenge/TP] Comprendre l’expansion de nom

Totor a écrit :

Parmi toutes celles reçues, je retiendrai l'avant dernière car tu as été influencé pour la dernière (désolé) :

Tout à fait normal ! ^^
Par contre, toutes les solutions qui reposent sur l'idée de mettre *, ou */*, ou */*/*, etc. s'arrêtent à un nombre maximal de récursion. J'avais pensé à un code qui gardait une variable "PATTERN" qui s'incrémentait de "*/" à chaque itération d'une boucle while. Cette boucle while verifiait en gros si ça valait le coup d'incrémenter encore de "*/"... Ca permettait de condenser le code autour de quelque chose de plus simple et récursif. Mais bon ensuite j'ai vu le coup du ** et j'ai abandonné cette piste !
En tout cas, joli challenge !


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#38 Le 22/09/2010, à 14:49

AnsuzPeorth

Re : [Mini Challenge/TP] Comprendre l’expansion de nom

est-ce du temps de perdu ?

Ca ne me servira pas à grand chose, mais le temps n'est jamais perdu lorsqu'on apprend du nouveau !


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne