Calcul du volume de certains sous-dossiers

Calcul du volume de certains sous-dossiers - Shell/Batch - Programmation

Marsh Posté le 11-12-2018 à 11:33:39    

Hello
 
Je suis à la recherche d'un script pour calculer l'espace disque pris par certains sous-dossiers.
En gros, la structure est la suivante :
_ dossier courant
\_sous-dossier 1
 \_2018-12-10 (il y a des sous-dossiers et fichiers dans ces dossiers)
 \_2018-12-09
 \_2018-12-08
 \_...
\_sous-dossier 2
 \_2018-12-10
 \_2018-12-09
 \_2018-12-08
 \_...
\_...
 
Et il faut que je trouve la taille globale de tous les dossiers datant d'avant une date que je peux paramétrer :o
Est-ce que quelqu'un aurait une idée de script pour faire ça proprement et de façon à peu près optimisée ? Le dossier courant faisant 800 Go avec de nombreux petits fichiers dedans, ça risque de prendre du temps... :o
 
Merci d'avance :)


---------------
Bobbyfrasier, Bobbyfrasier everywhere ! (Steam, Origin, ...)
Reply

Marsh Posté le 11-12-2018 à 11:33:39   

Reply

Marsh Posté le 11-12-2018 à 16:16:26    

Je suppose que tu veux du batch (donc Windows)? Regarde si la commande dir peut faire ce que tu veux (tapper dir /? en ligne de commande). Par contre 800Go c'est pas mal, vitesse à voir...

Reply

Marsh Posté le 11-12-2018 à 19:49:44    

Nop je souhaiterais faire ça sous unix ;)
Mais comme j'y connais pas grand chose en scripts comme ça, je préfère demander !


---------------
Bobbyfrasier, Bobbyfrasier everywhere ! (Steam, Origin, ...)
Reply

Marsh Posté le 11-12-2018 à 21:48:34    

Alors un truc avec find et ls?

Reply

Marsh Posté le 12-12-2018 à 08:17:06    

Je suis pas expert mais je sais que « du -h -d 1 . » perte de calculer la taille des dossiers présent dans le répertoire courant (« . »)
Et pour voir plus en profondeur, passer de 1 à 2,3,etc.  
 
Tu pourrais faire ça et filtrer les résultats après (pas très efficace), ou bien lister d’abord les répertoires, filtrer les dates, avant de faire des commandes « du ».  
 
Si tu connais pas trop le bash peut être que tu connais un peu le python, pourquoi pas essayer de le faire en python ?

Reply

Marsh Posté le 12-12-2018 à 09:33:16    

Thx pour les idées !
En python ça serait évidemment plus facile (voire même en matlab même si c'est moche, mais au moins je connais bien le langage :o )... Sauf que ce n'est pas dispo sur la machine en question et que je ne peux pas l'installer :(
Bon, un collègue a fait un truc à coup de "find" et de "du" mais en mode bruteforce avec plusieurs critères sur le find. Ca marche moyen et c'est ultra long mais ça permet de faire une partie de ce qu'on cherchait.
 
Si vous avez d'autres idées, je reste preneur :)


---------------
Bobbyfrasier, Bobbyfrasier everywhere ! (Steam, Origin, ...)
Reply

Marsh Posté le 27-12-2018 à 05:04:33    

le problème d'une command à base de find -exec du {}, c'est que tu vas recalculer la taille de tous les sous-dossiers (si t'es en extX, me semble le fs ne garde pas d'infos sur la taille d'un dossier, juste sur celles d'un fichier, donc du parcours toute l'arbo de chaque dossier pour calculer sa taille, sans memoïsation puisqu'il est appelé indépendamment sur chaque dossier par le find).
Une commande qui fait le du d'abord sera sûrement plus rapide (j'ose espérer que du fait de la memoization en interne. Je pense que oui puisqu'il printe d'abord les dossiers les plus profonds puis remonte)

 
Code :
  1. limitdate = $(date -d "2019-01-30 01:56" +%s)
  2. du -h --time --time-style=+%s . | while read line; do if [[ $(cut -f2 <<< "$line" ) -ge "$limitdate" ]]; then echo "$line"; fi; done
 

En gros, du imprime la taille de tous les sous-dossier (mais pas les fichiers, pour ça il faudrait mettre "-ha" au lieu de "-h" ) et leur timestamp de modification, puis on pipe ça dans un filtre qui compare au timestamp d'une date limite donnée.
La flemme de faire des tests, mais ça m'intéresse de savoir si ça va plus vite sur ton problème.


Message édité par Demodulateur le 27-12-2018 à 05:10:54
Reply

Sujets relatifs:

Leave a Replay

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