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

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

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

6 réponses

Avatar
patpro ~ Patrick Proniewski
In article <4a57114a$0$16777$,
Machin Truc wrote:

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

ZZ, qui continue à chercher...
Avatar
patpro ~ patrick proniewski
In article <4a57bdc9$0$8006$,
Machin Truc wrote:

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
Avatar
talon
Machin Truc wrote:


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
Avatar
Machin Truc
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.
Avatar
Erik LE VACON
Michel Talon a écrit :
Machin Truc wrote:

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