[freebsd 7] commande "du" non récursive...

Le
Machin Truc
hello

Une petite question : comment obtenir la somme de la taille des fichiers de chaque répertoire d'une arborescence ?
Comme un "du", mais sans l'héritage du total des répertoires enfants

j'ai essayé diverses choses avec find/du, mais décidément, je ne trouve pas
ex: find /home -type d | xargs -n1 du -d 0
quoique je fasse, "du" est récursif..

ZZ.
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
patpro ~ Patrick Proniewski
Le #19734821
In article Machin Truc
hello

Une petite question : comment obtenir la somme de la taille des fichiers de
chaque répertoire d'une arborescence ?
Comme un "du", mais sans l'héritage du total des répertoires enfants ...

j'ai essayé diverses choses avec find/du, mais décidément, je ne trouve
pas...
ex: find /home -type d | xargs -n1 du -d 0
quoique je fasse, "du" est récursif..



rapido-crado, je ne vois pas de solution élégante...
Je proposerais bien un truc comme ça, mais c'est crade et pas du tout
foolproof :

for dossier in $(find $PWD -type d); do
echo $dossier
find $dossier -type f | xargs -n 10000 du -hc | grep total
done

par exemple, les chemins avec des espaces ne sont pas gérés, les
dossiers vides sont affichés quand même, le 10000 limite le nombre de
fichiers traités à 10000 par dossier,...

patpro

--
A vendre ! http://www.patpro.net/blog/index.php/2008/01/12/133
Machin Truc
Le #19738111
patpro ~ Patrick Proniewski a écrit :

rapido-crado, je ne vois pas de solution élégante...
Je proposerais bien un truc comme ça, mais c'est crade et pas du tout
foolproof :

for dossier in $(find $PWD -type d); do
echo $dossier
find $dossier -type f | xargs -n 10000 du -hc | grep total
done

par exemple, les chemins avec des espaces ne sont pas gérés,



pas d'bol, c'est pour un espace commun de non informaticiens,
(macintoshiens pour ne rien arranger ;-) : le genre de mortel qui
mettent des /, des [], en plus de l'utf8 partout dans leurs noms
de fichiers ;-)
Sinon, j'avais bien fait un find ..... -print0 | xargs -0 .. pour
gérer leurs saletés de noms, mais ça peut pas passer par des
variables shell, y'a forcément + simple....

ZZ, qui continue à chercher...
patpro ~ patrick proniewski
Le #19738231
In article Machin Truc
patpro ~ Patrick Proniewski a écrit :

> rapido-crado, je ne vois pas de solution élégante...
> Je proposerais bien un truc comme ça, mais c'est crade et pas du tout
> foolproof :
>
> for dossier in $(find $PWD -type d); do
> echo $dossier
> find $dossier -type f | xargs -n 10000 du -hc | grep total
> done
>
> par exemple, les chemins avec des espaces ne sont pas gérés,

pas d'bol, c'est pour un espace commun de non informaticiens,
(macintoshiens pour ne rien arranger ;-) : le genre de mortel qui
mettent des /, des [], en plus de l'utf8 partout dans leurs noms
de fichiers ;-)
Sinon, j'avais bien fait un find ..... -print0 | xargs -0 .. pour
gérer leurs saletés de noms, mais ça peut pas passer par des
variables shell, y'a forcément + simple....



t'es cuit alors, parce même xargs se prendra les pieds la dedans (je
viens de tester).

patpro

--
A vendre : KVM IP 16 ports APC
http://patpro.net/blog/index.php/2008/01/12/133
talon
Le #19742491
Machin Truc


hello

Une petite question : comment obtenir la somme de la taille des fichiers de chaque répertoire d'une arborescence ?
Comme un "du", mais sans l'héritage du total des répertoires enfants ...

j'ai essayé diverses choses avec find/du, mais décidément, je ne trouve pas...
ex: find /home -type d | xargs -n1 du -d 0
quoique je fasse, "du" est récursif..

ZZ.




Voici une solution en python, inspirée de la documentation python du
module os, et qui, je pense fait l'affaire. Il faut spécifier le nom
complet de la racine, par exemple

rose% ./non_recurs_du.py /home/michel/mp3
/home/michel/mp3 size is 18503 K
/home/michel/mp3/Umagumma size is 125350 K
/home/michel/mp3/Stern size is 40501 K
....

rose% cat non_recurs_du.py
#!/usr/bin/env python
import os, sys
from os.path import join, getsize
path = sys.argv[1]
for root, dirs, files in os.walk(path):
size = sum(getsize(join(root, f)) for f in files)
size = size / 1024
print root, " size is ", size, "K"

Je pense que ceci est insensible à des caractères bizarres dans les
noms.

Ca marche parce que walk() retourne un triplet:
root: la racine qu'il explore
dirs: les directories que root contient
files:les fichiers ordinaires que root contient
et récurse automatiquement à partir de "path"

D'autre part sum(get.. for f ..) calcule la somme des tailles des
fichiers ordinaires. Je trouve que c'est un assez bel exemple de la
beauté de python!



--

Michel TALON
Machin Truc
Le #19880841
patpro ~ patrick proniewski a écrit :

t'es cuit alors, parce même xargs se prendra les pieds la dedans (je
viens de tester).



j'ai fini par modifier la commande "du".
Pour ceux que ça pourrait intéresser, le patch est disponible sous
forme d'un PR :
http://lists.freebsd.org/pipermail/freebsd-bugs/2009-July/036004.html

PM.
Erik LE VACON
Le #19962971
Michel Talon a écrit :
Machin Truc

hello

Une petite question : comment obtenir la somme de la taille des fichiers de chaque répertoire d'une arborescence ?
Comme un "du", mais sans l'héritage du total des répertoires enfants ...

j'ai essayé diverses choses avec find/du, mais décidément, je ne trouve pas...
ex: find /home -type d | xargs -n1 du -d 0
quoique je fasse, "du" est récursif..

ZZ.




Voici une solution en python, inspirée de la documentation python du
module os, et qui, je pense fait l'affaire. Il faut spécifier le nom
complet de la racine, par exemple

rose% ./non_recurs_du.py /home/michel/mp3
/home/michel/mp3 size is 18503 K
/home/michel/mp3/Umagumma size is 125350 K
/home/michel/mp3/Stern size is 40501 K
....

rose% cat non_recurs_du.py
#!/usr/bin/env python
import os, sys
from os.path import join, getsize
path = sys.argv[1]
for root, dirs, files in os.walk(path):
size = sum(getsize(join(root, f)) for f in files)
size = size / 1024
print root, " size is ", size, "K"

Je pense que ceci est insensible à des caractères bizarres dans les
noms.

Ca marche parce que walk() retourne un triplet:
root: la racine qu'il explore
dirs: les directories que root contient
files:les fichiers ordinaires que root contient
et récurse automatiquement à partir de "path"

D'autre part sum(get.. for f ..) calcule la somme des tailles des
fichiers ordinaires. Je trouve que c'est un assez bel exemple de la
beauté de python!






Magnifique et élégante solution !

Merci ;-)


Erik LE VACON
Publicité
Poster une réponse
Anonyme