#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
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
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 ). 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
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
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 **
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 - ?
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 !
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
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