Solution en Groovy.
Ce script doit être indépendant de la plate-forme, au cas où vous auriez besoin de l'exécuter sur un système non-Windows.
Configuration et collecte de fichiers
def archiveRoot = './test/backups'
def destinationRoot = archiveRoot
def maxDirSize = 200 * 1024 * 1024
def dirSize = maxDirSize + 1 // Size of current sub-dir
def dirNum = 1 // Sequence No. of next sub-dir
String dirName = "" // Name of current sub-dir
zipFiles = new AntBuilder().fileScanner {
fileset( dir: archiveRoot ) {
include name: "*.zip"
}
}
Le site zipFiles
Les variables sont maintenant une liste de chaque fichier zip qui doit être déplacé.
Déplacer des fichiers, créer des sous-dossiers
La logique de la taille du fichier est la seule partie non triviale. AntBuilder déplacera les fichiers, et créera les répertoires s'ils n'existent pas.
zipFiles.each { file ->
println '-' * 45
def newDirSize = dirSize + file.size()
printf '%10s, size: %s dirSize: %s, would be: %s\n',
file.name, sizeInMeg( file.size() ),
sizeInMeg( dirSize ), sizeInMeg( newDirSize )
if ( newDirSize >= maxDirSize ) {
dirName = "subDir_${dirNum++}"
println '=' * 45
dirSize = 0
}
dirSize += file.size()
new AntBuilder().move(
file: file.absolutePath,
todir: "${destinationRoot}/${dirName}"
)
println "new size: ${sizeInMeg(dirSize)}"
}
String sizeInMeg( size ) {
sprintf '%2.2f', size / 1024 / 1024
}
Exemple de sortie
Lorsque vous travaillez avec ces fichiers :
28/07/2020 12:28 <DIR> .
28/07/2020 12:28 <DIR> ..
18/08/2016 18:06 45,908,522 0001.zip
06/12/2018 07:35 110,335,437 0002.zip
27/08/2016 04:54 87,199,956 0003.zip
05/12/2018 02:40 127,576,284 0004.zip
01/08/2016 01:24 126,012,971 0005.zip
5 File(s) 497,033,170 bytes
2 Dir(s) 27,829,731,328 bytes free
Ces fichiers sont beaucoup plus gros que les vôtres, ce sont juste des fichiers que j'avais sous la main.
La sortie du terminal qui en résulte est :
---------------------------------------------
0001.zip, size: 43.78 dirSize: 200.00, would be: 243.78
=============================================
[move] Moving 1 file to c:\test\backups\subDir_1
new size: 43.78
---------------------------------------------
0002.zip, size: 105.22 dirSize: 43.78, would be: 149.01
[move] Moving 1 file to c:\test\backups\subDir_1
new size: 149.01
---------------------------------------------
0003.zip, size: 83.16 dirSize: 149.01, would be: 232.17
=============================================
[move] Moving 1 file to c:\test\backups\subDir_2
new size: 83.16
---------------------------------------------
0004.zip, size: 121.67 dirSize: 83.16, would be: 204.83
=============================================
[move] Moving 1 file to c:\test\backups\subDir_3
new size: 121.67
---------------------------------------------
0005.zip, size: 120.18 dirSize: 121.67, would be: 241.84
=============================================
[move] Moving 1 file to c:\test\backups\subDir_4
new size: 120.18
Deux fichiers sont déplacés dans le premier sous-répertoire. Les trois fichiers restants sont assez gros, ils ont donc chacun leur propre sous-répertoire. Avec des fichiers beaucoup plus petits, comme c'est votre cas, presque tous les répertoires auront plusieurs fichiers. Le dernier répertoire peut se retrouver avec un seul fichier.
Fonctionnement dans un environnement réel
Avec autant de fichiers à scanner, vous voudrez probablement supprimer tous les println
lignes. Ensuite, vous verrez juste la liste des fichiers en cours de déplacement, avec la destination. c'est-à-dire 1 ligne par fichier.