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

Trier par extension

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

6 réponses

Avatar
Stephane Chazelas
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

Avatar
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...
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/

Avatar
Stephane Chazelas
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


Avatar
Ph. Ivaldi
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/

Avatar
ALain Montfranc
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

Avatar
Ph. Ivaldi
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/