#!/bin/bash
pushd .
cd /var/db/pkg
for f in `find . -name *.ebuild`
do
  echo ${f%%.ebuild}
done
popd
1) le pushd et popd ne servent à rien car si tu éxécutes le script, un nouveau shell sera ouvert comme sous-processus et cela n'influencera en rien ton répertoire courant dans le shell appellant - ce n'est d'utilié que si tu le fais via une fonction shell ou si tu appelles le script via source (ou .), ce qui n'est pas le cas ;-)
(ou alors il y a une suite dans le script, j'ai pas suivi le thread ;-))

2) change le for en while et ça marchera

En bref, ça donne:

#!/bin/bash
cd /var/db/pkg
find . -name '*.ebuild' \
| while read f; do
echo ${f%%.ebuild}
done

mais cf. en bas du mail pour la version la plus simple avec sed ;-)

c'est le ${f%%.ebuild} qui enlève le .ebuild (merci Pascal pour un mail à ce sujet un jour ;-) )
C'est bien pratique hein ;-))

Ca évite surtout de devoir passer par un subshell et sed ou cut (ce qui est bcp plus lent).

Il y a aussi

%{x##*/}

qui est très pratique: ça équivaut à un "basename"

p.ex.:
x=/foo/bar/spam/eggs
=> ${x##*.} donnera: eggs

Il y a aussi moyen de faire des substitutions simples:

%{x/spam/eggs}

va remplacer "spam" par "eggs" partout dans la variable x
(en fait, retourne une valeur dans laquelle le remplacement est fait, ça ne modifie pas x évidemment ;-))

...
je crois qu'il y a moyen de tout faire de le find avec la commande -exec, mais je n'ai pas trouvé comment s'en sortir avec la substitution:
... -exec echo ${{}%%.ebuild} (le {} remplace le fichier trouvé)
Ca, ça ne marche pas: le exec ne saurait pas lancer de commande bash, il fait un fork+exec !

Non, oublie le -exec, ça aura pour conséquence que find fera (pour chaque fichier trouvé) un fork et exec d'un nouveau sous-processus pour éxécuter la commande.

Si possible, il faut essayer d'utiliser "while" ou "for" et les builtins bash pour faire des transformations, c'est de loin le plus performant ;-)
(en bref, éviter la création de sous-processus)

du -cha /var/db/pkg | grep ebuild | cut -c 18-
...
j'aimerais supprimer le '.ebulid' seulement cut ne me propose pas de coupé les x derniers caractères de la ligne. je connais pas trop textutils, qqn peut il m'aider?
Voici la solution la plus simple:

( cd /var/db/pkg; find * -name '*.ebuild' | sed 's/\.ebuild$//' )

(y compris les ( ): ça lance un subshell et évite de changer ton répertoire courant dans le shell appelant)

--
-o) Pascal Bleser ATOS Origin/Aachen(DE) |
/\\ <[EMAIL PROTECTED]> |
_\_v <[EMAIL PROTECTED]> |
---------------------------------------------|
Jesus saves,Buddha makes incremental backups :
---------------------------------------------'


_______________________________________________________
Linux Mailing List - http://www.unixtech.be
Subscribe/Unsubscribe: http://www.unixtech.be/mailman/listinfo/linux
Archives: http://www.mail-archive.com/linux@;lists.unixtech.be
IRC: efnet.skynet.be:6667 - #unixtech


Répondre à