Trier par extension

Le
Ph. Ivaldi
Re,

Je voudrais trier des fichiers suivant leur extension qui est
numériques.
C'est ultra classique mais je ne m'en sors pas.

$ ls toto*
toto.1 toto.10 toto.2 toto.titi.1 toto.titi.10 toto.titi.2

$ ls toto* | sort -g -t. -k 2,2 -k 3,3 -k 4,4 -k 5,5
toto.titi.1
toto.titi.2
toto.titi.10
toto.1
toto.2
toto.10

c'est ce que je veux obtenir mais la commande n'est pas robuste; elle ne
fonctionne pas s'il y plus de 5 points dans le nom du fichier.
Une proposition ?

--
Merci de votre attention,
Philippe Ivaldi.
http://piprim.tuxfamily.org/
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Stephane Chazelas
Le #754352
2007-07-01, 15:26(+02), Ph Ivaldi:
Re,

Je voudrais trier des fichiers suivant leur extension qui est
numériques.
C'est ultra classique mais je ne m'en sors pas.

$ ls toto*
toto.1 toto.10 toto.2 toto.titi.1 toto.titi.10 toto.titi.2

$ ls toto* | sort -g -t. -k 2,2 -k 3,3 -k 4,4 -k 5,5
toto.titi.1
toto.titi.2
toto.titi.10
toto.1
toto.2
toto.10

c'est ce que je veux obtenir mais la commande n'est pas robuste; elle ne
fonctionne pas s'il y plus de 5 points dans le nom du fichier.
Une proposition ?


Avec zsh:

print -rl toto*(n)

Sinon:

ls | perl -e 'print for sort {
($a1, $a2) = ($a =~ /(.*?)(d*)n$/);
($b1, $b2) = ($b =~ /(.*?)(d*)n$/);
($a1 cmp $b1) || ($a2 <=> $b2) } <>'

--
Stéphane

Ph. Ivaldi
Le #758147
Le 01 juillet 2007, Stephane Chazelas écrivit :

Avec zsh:
print -rl toto*(n)
Sinon:
[code perl]


Merci de ton aide.
A priori ce n'est pas simple à faire avec sh...
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/

Stephane Chazelas
Le #758146
2007-07-02, 17:48(+02), Ph Ivaldi:
Le 01 juillet 2007, Stephane Chazelas écrivit :

Avec zsh:
print -rl toto*(n)
Sinon:
[code perl]


Merci de ton aide.
A priori ce n'est pas simple à faire avec sh...


sh est un interpreteur de commandes. Donc "faire avec sh" ne
fait pas forcement de sens.

Avec sh, tu peux faire appel aux commandes perl ou zsh.

Maintenant, si tu voulais dire "avec sh et les outils Unix
standard", alors c'est possible avec des trucs tu genre:

$ ls | awk '
match($0, /.*./) {
$0 = substr($0, RLENGTH+1) "." substr($0,1,RLENGTH-1)
}
{print}' | sort -t. -k2 -k1,1n | awk '
match($0, /./) {
$0 = substr($0, RSTART+1) "." substr($0,1,RSTART-1)
}
{print}'

--
Stéphane


Ph. Ivaldi
Le #758145
Le 02 juillet 2007, Stephane Chazelas écrivit :

Maintenant, si tu voulais dire "avec sh et les outils Unix
standard",


Oui, c'est bien ce que je voulais dire.
Merci pour la rectification.

alors c'est possible avec des trucs tu genre:
[code utilisant awk]


Parfait.
Il va bien falloir un jour ou l'autre que j'approfondisse mes
connaissances sur awk.
Encore merci pour tout.
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/

ALain Montfranc
Le #761917
Ph. Ivaldi a écrit
Re,

Je voudrais trier des fichiers suivant leur extension qui est
numériques.
C'est ultra classique mais je ne m'en sors pas.

$ ls toto*
toto.1 toto.10 toto.2 toto.titi.1 toto.titi.10 toto.titi.2

$ ls toto* | sort -g -t. -k 2,2 -k 3,3 -k 4,4 -k 5,5
toto.titi.1
toto.titi.2
toto.titi.10
toto.1
toto.2
toto.10

c'est ce que je veux obtenir mais la commande n'est pas robuste; elle ne
fonctionne pas s'il y plus de 5 points dans le nom du fichier.
Une proposition ?




ls |sed 's/TAB/__CECI_EST_UNE_TABLULATION__/g' |
sed 's/.[^.]*$/TAB&/' | sort -k2 |
sed 's/TAB//' |
sed 's/__CECI_EST_UNE_TABLULATION__/TAB/g'

(TAB est à remplacer par une tabulation - 3 instannces)

Explication :
- on liste les fichiers
- on remplace le TAB eventuel dans les nom par une sequence inexistance
- on ajoute avant le . final un tab (=> 2 champs)
- on trie sur le second champ
- on vire la tabulation
- on remet les eventuels TAB en place

Ph. Ivaldi
Le #761636
Le 19 juillet 2007, ALain Montfranc écrivit :

ls |sed 's/TAB/__CECI_EST_UNE_TABLULATION__/g' |
sed 's/.[^.]*$/TAB&/' | sort -k2 |
sed 's/TAB//' |
sed 's/__CECI_EST_UNE_TABLULATION__/TAB/g'



Simple et efficace.
Merci pour cette solution ingénieuse.
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/

Publicité
Poster une réponse
Anonyme