[shell] tris d'une taille

tris d'une taille [shell] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 30-08-2007 à 08:30:51    

Bonjour
 
J'aimeria pourvoir trier la sortie de cette commande :  

du -hs *


En utilisant sort -n comme ci dessous, la lettre réprésentant l'unité n'est pas prise en compte (k, M ,G ...)

du -hs * | sort -n


Une idèe ?

Reply

Marsh Posté le 30-08-2007 à 08:30:51   

Reply

Marsh Posté le 30-08-2007 à 08:36:48    


retirer le -h ... :spamafote:


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 31-08-2007 à 02:07:41    

Sinon :
 
du -s * | sort -nr | awk '{print $1, "ko", $2}'

Reply

Marsh Posté le 31-08-2007 à 07:29:48    

merci pour ta réponse mais ca ne fais que rajouter Ko a toutes les lignes.
Ca reviens a faire un : du -s * | sort -n
Pas d'autres idées ?

Reply

Marsh Posté le 31-08-2007 à 07:57:33    

Ben je vois pas trop comment la commande "sort" pourrait comprendre que tu veux trier d'abord les Ko, puis les Mo et enfin les Go ... :gratgrat:
 
Elle est bête la commande, elle voit par exemple:
15Go
950Mo
300Ko
Et tu lui dit de trier selon les chiffres ... forcément, elle va te donner ça:
15Go
300Ko
950Mo
 
:spamafote:
 
Après, si tu veux qqch de vraiment aboutit, ben faut coder ça toi même :o


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 01-09-2007 à 23:33:41    

Et ne serait il pas possible d'afficher une colonne supplémentaire a la sortie de du.
Je m'explique, la première , la taille en byte (option -b) et la deuxième au format humain (option -h )

Reply

Marsh Posté le 02-09-2007 à 13:00:05    


#
### Affichage "du" en 3 colonnes :
### octets - Ko|Mo - Repertoire
#
du -h > duh.tmp  
du -b > dub.tmp  
join -1 2 -2 2 -o 2.1,1.1,1.2 duh.tmp dub.tmp | \
sort -k1,1n | \
awk '{printf("%15s : %-8s%s\n",$1,$2,$3)}'
rm duh.tmp dub.tmp

Reply

Marsh Posté le 02-09-2007 à 13:10:33    

Sinon tu peux te faire un petit script qui va reformater la sortie d'un "du -sb | sort -n" pour une lecture "Humaine".
 
Exemple en Python :

Code :
  1. #! /usr/bin/python
  2. import sys
  3. import string
  4. line = sys.stdin.readline()
  5. while line != None and line != "":
  6.     size = float(line.split()[0])
  7.     if size > 1073741824:
  8.         print '%.2f'%(size/1073741824), "Go", string.join(line.split()[1:], " " )
  9.     elif size > 1048576:
  10.         print '%.2f'%(size/1048576), "Mo", string.join(line.split()[1:], " " )
  11.     elif size > 1024:
  12.         print '%.2f'%(size/1024), "Ko", string.join(line.split()[1:], " " )
  13.     line = sys.stdin.readline()


 
Puis :  
$ du -bs * | sort -n | /tmp/sort.py


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Marsh Posté le 02-09-2007 à 13:21:03    

Bah pas besoin de sortir du python :o
 
Le "du -s | sort -n" trie pour nous, on peut récupérer la liste triée avec cut, et on peut filer plusieurs arguments à "du -h"..... d'où :
 

du -sh $(du -s * | sort -n | cut -f 2)


 


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 02-09-2007 à 13:31:28    

Ca marche pas pour les noms de repertoires qui contiennent des espaces :o


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Marsh Posté le 02-09-2007 à 13:31:28   

Reply

Marsh Posté le 02-09-2007 à 13:52:42    

e_esprit a écrit :

Ca marche pas pour les noms de repertoires qui contiennent des espaces :o

 

ok ok je rajoute un while :

du -s * | sort -n | cut -f 2 | while read r; do du -sh "$r"; done

 

mais là tu vois, c'est moins beau... et c'est de ta faute :o :D

Message cité 1 fois
Message édité par Xavier_OM le 02-09-2007 à 13:53:20

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 02-09-2007 à 14:00:42    

Ok, je plaide coupable :o
Mais au moins ca marche [:cosmoschtroumpf]


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
Reply

Marsh Posté le 02-09-2007 à 15:16:17    

Xavier_OM a écrit :


 
ok ok je rajoute un while :

du -s * | sort -n | cut -f 2 | while read r; do du -sh "$r"; done


 
mais là tu vois, c'est moins beau... et c'est de ta faute :o :D

Ouais, mais c'est un peu overkill de faire le 'du' en double...
 
Je penche pour une solution scriptée comme e_esprit. (mais perso je l'aurais plutôt fait en perl...)


---------------
TriScale innov
Reply

Marsh Posté le 02-09-2007 à 23:17:41    

le script me plait bien merci

Reply

Marsh Posté le 04-09-2007 à 14:26:22    

franceso a écrit :

Ouais, mais c'est un peu overkill de faire le 'du' en double...
 
Je penche pour une solution scriptée comme e_esprit. (mais perso je l'aurais plutôt fait en perl...)


 
 
ou en sed

du -s * | sort -n | sed -e 's/^\([0-9]\+\)[0-9][0-9][0-9]\([ \t].*\)/\1M\2/g'


 
Du coup c'est plus overkill, un seul "du" et ni perl ni python :o


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 10-09-2007 à 21:44:40    

pas mal
Merci

Reply

Marsh Posté le 11-09-2007 à 08:30:32    

Mais ca suppose qu'un mega c'est 1000 kilo.

Reply

Marsh Posté le 11-09-2007 à 10:00:02    

matafan a écrit :

Mais ca suppose qu'un mega c'est 1000 kilo.


 
c'est sûr que niveau précision de calcul les regexp on a vu mieux  :D
 
un peu de awk ?  

du -s * | sort -n | awk -F '\t' '{
    SIZE=$1
    NAME=$2
    if (SIZE ~ /[0-9][0-9][0-9][0-9]+/ ) {  
        SIZE /= 1024
        print SIZE "M " NAME
    }
    else {
        print SIZE "K " NAME
    }
}'


 
:ange:


Message édité par Xavier_OM le 21-09-2007 à 15:44:43

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed