Tri de répertoire
Le
Kevin Denis
Bonjour,
[système linux, bash]
je dois trier des répertoires pour trouver le premier de ceux-ci (et
setter une variable avec ce nom).
Le problème provient du nommage de ceux-ci. J'ai, en liste exhaustive
des dossiers s'appelant:
OFFICIAL, BETA1, BETA2, , RC1, RC2, ALPHA1, ALPHA2, etc.
Avec forcément une seule OFFICIAL ou pas, zéro ou plusieurs RC, zéro ou
plusieurs BETA et ALPHA.
Dans l'ordre, j'ai le plus ancien: ALPHA1 -> ALPHAx, BETA1 -> BETAx,
RC1 -> RCx, OFFICIAL.
Quelle serait la meilleur méthode? J'utilise un script qui les
parse les uns après les autres, mais je trouve ça dommage, il
y a peut-être mieux.
Merci
--
Kevin
[système linux, bash]
je dois trier des répertoires pour trouver le premier de ceux-ci (et
setter une variable avec ce nom).
Le problème provient du nommage de ceux-ci. J'ai, en liste exhaustive
des dossiers s'appelant:
OFFICIAL, BETA1, BETA2, , RC1, RC2, ALPHA1, ALPHA2, etc.
Avec forcément une seule OFFICIAL ou pas, zéro ou plusieurs RC, zéro ou
plusieurs BETA et ALPHA.
Dans l'ordre, j'ai le plus ancien: ALPHA1 -> ALPHAx, BETA1 -> BETAx,
RC1 -> RCx, OFFICIAL.
Quelle serait la meilleur méthode? J'utilise un script qui les
parse les uns après les autres, mais je trouve ça dommage, il
y a peut-être mieux.
Merci
--
Kevin

Poser une question


Kevin Denis
Bonjour,
Soit je n'ai pas compris, soit la ligne suivante devrait faire
l'affaire :
ls -l | grep ^d | awk '{ print $9; }' | uniq | sort | head -n1
Il y a certainement plus simple...
JKB
--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Autrement dit, tu as un « alphabet » ordonné α, β, ρ (pour RC) puis ω
(pour officiel), avec les lettres grecques translittérées.
Note : je n'ai pas de système conforme sous la main pour tester, donc la
suite est théorique...
Selon la norme POSIX, tu peux éventuellement définir un ordre de tri
(LC_COLLATE) spécialisé qui couvrirait ton besoin, et la syntaxe permet
même de faire «automatiquement» la réduction ALPHA -> α
LC_COLLATE
collating-element <kevinALPHA> from "<A><L><P><H><A>"
collating-element <kevinBETA> from "<B><E><T><A>"
collating-element <kevinRC> from "<R><C>"
collating-element <kevinOFFICIAL> from "<O><F><F><I><C><I><A><L>"
order_start forward
UNDEFINED IGNORE
<kevinALPHA>
<kevinBETA>
<kevinRC>
<kevinOFFICIAL>
<zero>
<one>
<two>
<three>
<four>
<five>
<six>
<seven>
<eight>
<nine>
# rajouter les autres symboles possibles dans tes noms de fichiers
# (à condition qu'ils soient significatifs, sinon UNDEFINED s'en occupe)
order_end
END LC_COLLATE
Si les noms de fichiers peuvent comporter des lettres sans que la casse
soit significative, il faut utiliser après <nine>:
<a>
<A> <a>
<b>
<B> <b>
# etc.
Ou, de manière équivalente mais peut-être plus explicite :
<a> <a>
<A> <a>
<b> <b>
<B> <b>
# etc.
Ensuite, il suffit de compiler (man localedef(1)) l'ordre ainsi défini,
puis de le faire utiliser par les utilitaires normaux genre ls ou sort
en forçant LC_COLLATE de l'environnement au cas par cas.
Comme d'habitude avec les noms de fichiers, le résultat sera que 1
viendra avant 10, mais celui-ci précédera 2 ; je ne sais pas éviter ce
problème avec ce système de tri.
La méthode ci-dessus est peut-être plus conforme aux normes en vigueur,
mais je ne suis pas convaincu qu'elle soit plus efficace que la méthode
gros lourd, et je suis sûr qu'elle est moins portable...
Mais c'est sûrement marrant d'essayer !
Antoine
Mon gnu ls possède une option -v, qui liste avec un ordre
quasiement equivalent à ce que tu veux, hormis le OFFICIAL.
Donc, on peut commencer par tester OFFICIAL, et sinon,
ls -vl | grep ^d | cut -c 52- | tail -n 1
Ou remplacer le cut par un awk ou un sed, en fonction du besoin.
Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Super instructif, merci !
De loin la meilleure solution amha, bien que pas forcément la plus
évidente de prime abord (mais après, ça doit être un bonheur de la faire
évoluer selon les besoins)
Là, pas d'autre solution que de jouer avec awk/sed et sort -n (pour numeric).
Ou de revoir la numérotation des versions en rajoutant des zéros non
significatifs.. (01, 02, etc..)
Pourquoi pas portable ?
Ça, oui :)
--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
Je ne sais pas si c'est vraiment significatif, mais j'ai une préférence
pour utiliser head plutôt que tail, qui permet de quitter sitôt la
première ligne affichée (plutôt que d'attendre l'affichage de *toute* la
sortie...)
ls -vlr | ... | head -n1
--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]