OVH Cloud OVH Cloud

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
Benoit Izac
Bonjour,

le 27/09/2011 à 09:25, Kevin Denis a écrit dans le message
:

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



Je ne suis pas sûr de bien comprendre, c'est dans cet ordre que tu veux
que ça apparaisse : si il n'y a que deux répertoires RC1 et OFFICIAL, tu
veux RC1 dans ta variable ?

--
Benoit Izac
Avatar
Stephane CHAZELAS
2011-09-27, 07:25(+00), Kevin Denis:
[...]
[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.


[...]

[système any, zsh]

$ s() REPLY=${${${${REPLY//ALPHA/[1]}//BETA/[2]}//RC/[3]}//OFFICIAL/[4]}
$ print -rl -- *(no+s)
ALPHA0.1
ALPHA1
ALPHA1.1
ALPHA2
ALPHA2.0
ALPHA3.2
ALPHA10
BETA0.1
BETA1
BETA1.1
BETA2
BETA2.0
BETA3.2
BETA10
RC0.1
RC1
RC1.1
RC2
RC2.0
RC3.2
RC10
OFFICIAL0.1
OFFICIAL1
OFFICIAL1.1
OFFICIAL2
OFFICIAL2.0
OFFICIAL3.2
OFFICIAL10

--
Stephane
Avatar
Benoit Izac
Bonjour,

le 27/09/2011 à 20:01, Stephane CHAZELAS a écrit dans le message
:

je dois trier des répertoires pour trouver le premier de ceux-ci (et
setter une variable avec ce nom).


[...]

[système any, zsh]

$ s() REPLY=${${${${REPLY//ALPHA/[1]}//BETA/[2]}//RC/[3]}//OFFICIAL/[4]}
$ print -rl -- *(no+s)



Joli mais ne manquerait-il pas un « / » dans le glob qualifiers ?

--
Benoit Izac
Avatar
Cyrille Lefevre
Le 27/09/2011 16:33, 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'affic hage 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 !


<snip>

Je proposerais donc plutôt ceci :

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



tant qu'on y est, autant virer le find :

j= s=; for i in */; do j="$j$s${i%/}" s=$'n'; done; echo "$j"

la finesse vient du */ qui ne ramasse que les répertoires
les $j et $s servent à limiter les appels à echo, print, printf , etc.

s=$'n' peut être écrit
s='
'
sur les shell ne supportant pas cette syntaxe.

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Cyrille Lefevre
Le 27/09/2011 09:25, 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.

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,

je crois ne pas être le seul à penser que l'ennoncé n'est pas clair ,
peux-tu produire des exemples de ce que tu veux en fonction de ce que tu
as ? genre 2/3...

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Kevin Denis
Le 27-09-2011, Cyrille Lefevre a écrit :
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,

je crois ne pas être le seul à penser que l'ennoncé n'est pas clair,
peux-tu produire des exemples de ce que tu veux en fonction de ce que tu
as ? genre 2/3...



Voici un exemple:
V2/
OFFICIAL
RC3
RC2
RC1
V3/
ALPHA3
ALPHA2
V4/
OFFICIAL
V5/
ALPHA1
BETA1

Je veux trouver la V2 la plus récente: OFFICIAL.
La V3 sera donc ALPHA3
La V4, OFFICIAL
La v5: BETA1

J'utilise:

LAST=NONE
for dir in ALPHA BETA RC OFFICIAL
do
SUB=`ls -r $VERSION | grep $dir | head -1`
[ -z $SUB ] || LAST=$SUB
done
echo la dernire version est la $SUB pour $VERSION

--
Kevin
Avatar
Kevin Denis
Le 27-09-2011, Stephane CHAZELAS a écrit :
[système linux, bash]



[...]

[système any, zsh]



Hélas. Mais ça donne envie zsh.

$ s() REPLY=${${${${REPLY//ALPHA/[1]}//BETA/[2]}//RC/[3]}//OFFICIAL/[4]}
$ print -rl -- *(no+s)



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



Je ne suis pas sûr de bien comprendre, c'est dans cet ordre que tu veux
que ça apparaisse : si il n'y a que deux répertoires RC1 et OFFICIAL, tu
veux RC1 dans ta variable ?



non, OFFICIAL, pour le coup.
--
Kevin
Avatar
Stephane CHAZELAS
2011-09-29, 14:12(+00), Kevin Denis:
[...]
Voici un exemple:
V2/
OFFICIAL
RC3
RC2
RC1
V3/
ALPHA3
ALPHA2
V4/
OFFICIAL
V5/
ALPHA1
BETA1

Je veux trouver la V2 la plus récente: OFFICIAL.


[...]

$ s() REPLY=${${${${REPLY//ALPHA/[1]}//BETA/[2]}//RC/[3]}//OFFICIAL/[4]}
$ echo V2/*(nO+s[1])
V2/OFFICIAL
$ echo V2/*(nO+s[1]:t)
OFFICIAL
$ ls V2
OFFICIAL/ RC1/ RC2/ RC3/

--
Stephane
Avatar
Cyrille Lefevre
Le 29/09/2011 16:12, Kevin Denis a écrit :
Le 27-09-2011, Cyrille Lefevre a écrit :
je dois trier des répertoires pour trouver le premier de ceux-ci (e t
setter une variable avec ce nom).

Le problème provient du nommage de ceux-ci. J'ai, en liste exhausti ve
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 -> BET Ax,
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,

je crois ne pas être le seul à penser que l'ennoncé n'est pas cl air,
peux-tu produire des exemples de ce que tu veux en fonction de ce que tu
as ? genre 2/3...



Voici un exemple:
V2/
OFFICIAL
RC3
RC2
RC1
V3/
ALPHA3
ALPHA2
V4/
OFFICIAL
V5/
ALPHA1
BETA1

Je veux trouver la V2 la plus récente: OFFICIAL.
La V3 sera donc ALPHA3
La V4, OFFICIAL
La v5: BETA1

J'utilise:

LAST=NONE
for dir in ALPHA BETA RC OFFICIAL
do
SUB=`ls -r $VERSION | grep $dir | head -1`
[ -z $SUB ] || LAST=$SUB
done
echo la dernire version est la $SUB pour $VERSION



Bonjour,

hé voila :

$ ls -d */* | awk -F/ '{ b[$1] = b[$1] ~ "OFF" ? b[$1] : $2 } END { for
(i in b) print i, b[i] }'
V2 OFFICIAL
V3 ALPHA3
V4 OFFICIAL
V5 BETA1

coup de bol, ça sort dans l'ordre ! sinon, ajouté un | sort -V (gnuis me)

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
remove "%nospam" and ".invalid" to answer me.
1 2