Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tri de répertoire

20 réponses
Avatar
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

10 réponses

1 2
Avatar
JKB
Le 27 Sep 2011 07:25:44 GMT,
Kevin Denis écrivait :
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.



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
Avatar
Antoine Leca
Kevin Denis écrivit :
Dans l'ordre, j'ai le plus ancien: ALPHA1 -> ALPHAx, BETA1 -> BETAx,
RC1 -> RCx, OFFICIAL.



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.


il y a peut-être mieux.



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
Avatar
Marc Boyer
Le 27-09-2011, Kevin Denis a écrit :
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.



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
Avatar
Hugues
Ce cher Antoine Leca a posté :

Kevin Denis écrivit :
Dans l'ordre, j'ai le plus ancien: ALPHA1 -> ALPHAx, BETA1 -> BETAx,
RC1 -> RCx, OFFICIAL.




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 -> α
[...]



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)

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.



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..)


il y a peut-être mieux.



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...



Pourquoi pas portable ?

Mais c'est sûrement marrant d'essayer !



Ça, oui :)

--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
Avatar
Hugues
Ce cher Marc Boyer a posté :

Le 27-09-2011, Kevin Denis a écrit :
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.



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



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/]
Avatar
Marc Boyer
Le 27-09-2011, Hugues a écrit :
Ce cher Marc Boyer a posté :
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



Si on veut optimiser un algo, il faut le regarder dans son ensemble,
et ici, mettre le head avant le cut.
ls -vlr | grep ^d | head -n1 | cut -c 52
On pourrait aussi faire un script awk/sed qui fasse ce que fait
le couple grep/head voire greap/head/cut tant qu'on y est.

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Avatar
Hugues
Ce cher Marc Boyer a posté :

Le 27-09-2011, Hugues a écrit :
Ce cher Marc Boyer a posté :
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



Si on veut optimiser un algo, il faut le regarder dans son ensemble,
et ici, mettre le head avant le cut.



Exact. Et donc, tant qu'à faire, virer ce ls !

Car ls ne sert qu'à formater l'affichage des fichiers/dossiers pour être
lus par un être humain, et pas pour être passés dans un shellscript
(car trop dépendant de l'environnement utilisateur, sans compter le
nombre de choses inutiles qu'il nous affiche...)


Je proposerais donc plutôt ceci :

find * -prune -type d | sort -r | head -n1

--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
Avatar
Marc Boyer
Le 27-09-2011, Hugues a écrit :

Ce cher Marc Boyer a posté :

Le 27-09-2011, Hugues a écrit :
Ce cher Marc Boyer a posté :
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



Si on veut optimiser un algo, il faut le regarder dans son ensemble,
et ici, mettre le head avant le cut.



Exact. Et donc, tant qu'à faire, virer ce ls !

Car ls ne sert qu'à formater l'affichage des fichiers/dossiers pour être
lus par un être humain, et pas pour être passés dans un shellscript
(car trop dépendant de l'environnement utilisateur, sans compter le
nombre de choses inutiles qu'il nous affiche...)



Oui, mis ce qui m'interessais dans le ls, c'est l'option -v qui
permet de trier suivant un mélange alphabétique/numérique
ALPHA1
ALPHA2
ALPHA10
ce que ne semble pas faire sort, qui se contente de
ALPHA1
ALPHA10
ALPHA2

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Avatar
Hugues
Ce cher Marc Boyer a posté :

Le 27-09-2011, Hugues a écrit :

Et donc, tant qu'à faire, virer ce ls !

Car ls ne sert qu'à formater l'affichage des fichiers/dossiers pour être
lus par un être humain, et pas pour être passés dans un shellscript
(car trop dépendant de l'environnement utilisateur, sans compter le
nombre de choses inutiles qu'il nous affiche...)



Oui, mis ce qui m'interessais dans le ls, c'est l'option -v qui
permet de trier suivant un mélange alphabétique/numérique
ALPHA1
ALPHA2
ALPHA10
ce que ne semble pas faire sort, qui se contente de
ALPHA1
ALPHA10
ALPHA2



man sort. J'ai trouvé l'option -V .. (et j'ai appris un truc ;o))


(Au passage, il y a une différence entre sort -V et ls -v .. Je te
laisse trouver laquelle)

--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
Avatar
Marc Boyer
Le 27-09-2011, Hugues a écrit :

Ce cher Marc Boyer a posté :

Le 27-09-2011, Hugues a écrit :

Et donc, tant qu'à faire, virer ce ls !

Car ls ne sert qu'à formater l'affichage des fichiers/dossiers pour être
lus par un être humain, et pas pour être passés dans un shellscript
(car trop dépendant de l'environnement utilisateur, sans compter le
nombre de choses inutiles qu'il nous affiche...)



Oui, mis ce qui m'interessais dans le ls, c'est l'option -v qui
permet de trier suivant un mélange alphabétique/numérique
ALPHA1
ALPHA2
ALPHA10
ce que ne semble pas faire sort, qui se contente de
ALPHA1
ALPHA10
ALPHA2



man sort. J'ai trouvé l'option -V .. (et j'ai appris un truc ;o))



Bien vu. J'avais cherché, mais trop vite.

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
1 2