2 votes

Trier un grand nombre de fichiers dans des dossiers de taille égale (Windows)

J'ai environ 15000 fichiers zip d'une taille totale d'un peu plus de 10 gb qui doivent être triés dans des dossiers qui ne doivent pas dépasser 200 mb. (aucun des fichiers ne dépasse 40 Mo et la plupart sont inférieurs à 1 Mo).

Pour l'instant, ils sont tous dans un seul dossier et la convention de dénomination (si elle est requise) est la suivante CON-XXXXX.zip (où xxxxx est un nombre compris entre 00001 et 15000)

Avez-vous une idée pour un bat/vbs ou quelque chose qui créerait les dossiers requis (le nom n'est pas important) et y déplacerait ou copierait les fichiers ?

Une aide serait très appréciée ! Je ne vois pas comment cela pourrait être fait parce que je ne connais pas de moyen de "suivre" la taille d'un dossier de sorte que lorsqu'il s'approche de 200 mb, le script va en créer un nouveau. Mais encore une fois, je ne connais pas grand chose aux scripts.

2voto

programmer365 Points 1

Voici un exemple de lot script pour vous.

Il créera des dossiers selon le modèle Folder1, Folder2, etc. Vous devez remplacer "Filepath" dans la deuxième ligne par le chemin où se trouvent les fichiers .zip.

Le code (TESTED)

@echo off
pushd "Filepath"
setlocal enabledelayedexpansion
set fn=1
for %%a in (*.zip) do (
  if not exist "Folder!fn!" md "Folder!fn!"
  for %%b in ("%__cd__%Folder!fn!") do if "%%~zb" gtr "209715200" (
    set /a fn=!fn!+1
    md "Folder!fn!"
  )
  move "%%~fa" "Folder!fn!\"
)

0voto

Justin Kirk Points 736

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.

0voto

iTwasnTme Points 5586
@echo off & title <nul 

setlocal enabledelayedexpansion
color 0a && cd /d "%~dp0" & title .\%~nx0

:next
set "_zOk=." && set _dir=<nul 
set /a "_cnt+=1+0, _sz_lmt=209715200"
if not exist *.zip endlocal && goto=:EOF 

for /f tokens^=* %%i in ('dir /b /o:s *.zip')do (
     call :^) %%~zi 0000 "%%~fi" !_cnt! && echo\
     2>nul cd /d "%~dp0!_dir!" && cd.. || mkdir "%~dp0!_dir!"
     if not !_sz_lmt! gtr %%~zi move "%%~fi" "!_dir!\" >nul && echo\ Moved: "%%~fj" ".\!_dir!"
     set /a "_sz_lmt-=%%~zi" && echo\Folder: "%~dp0!_dir!"

     :loop
     for /f tokens^=* %%j in ('dir /b /o:-s *.zip')do for /f %%K in ('
         set /a !_sz_lmt!-%%~zj')do set "_szj=%%~K" && if not !_szj! leq -1 (
         move "%%~fj" "!_dir!\" >nul && set /a "_sz_lmt=!_szj!" && echo\ Moved: "%%~fj" ".\!_dir!"
        )
     call :^] "%~dp0!_dir!" && goto=:next
    )

:^)
set "_lst=%~1" && set "_dir=00%~4" || endlocal && goto=:EOF
set "_lst_=%~3!_lst!" && call set "_dir=Zip_!_dir:~-3!" & exit /b 

:^]
for /f tokens^=3 %%i in ('dir "%~1\*"^|findstr.exe ",.*bytes"
')do set "_zf=%%~i" && call set /a "_zf=!_zf:,=!/1024/1024" && (
cmd.exe /v:on /c "echo\Folder: "%~1\" Size: !_zf!MB" && exit /b )

En gros, cela utilise une boucle for pour obtenir le 1º plus gros fichier et 2 boucles pour obtenir d'autres plus petits fichiers à additionner jusqu'à 200 MB ou approximativement, ajouter un compteur pour créer les dossiers Zip_001-Zip_xxx


  • Sorties de mon dossier = 3.8 GB

    Folder: "F:\zip_test\Zip_001" Moved: "F:\zip_test\0084.zip" ".\Zip_001" Moved: "F:\zip_test\0089.zip" ".\Zip_001" Moved: "F:\zip_test\0086.zip" ".\Zip_001" Folder: "F:\zip_test\Zip_001\" Size: 191MB

    Folder: "F:\zip_test\Zip_002" Moved: "F:\zip_test\0013.zip" ".\Zip_002" Moved: "F:\zip_test\0030.zip" ".\Zip_002" Moved: "F:\zip_test\0115.zip" ".\Zip_002" Folder: "F:\zip_test\Zip_002\" Size: 191MB

    Folder: "F:\zip_test\Zip_003" Moved: "F:\zip_test\0140.zip" ".\Zip_003" Moved: "F:\zip_test\0108.zip" ".\Zip_003" Moved: "F:\zip_test\0051.zip" ".\Zip_003" Folder: "F:\zip_test\Zip_003\" Size: 187MB

    Folder: "F:\zip_test\Zip_004" Moved: "F:\zip_test\0058.zip" ".\Zip_004" Moved: "F:\zip_test\0057.zip" ".\Zip_004" Moved: "F:\zip_test\0075.zip" ".\Zip_004" Folder: "F:\zip_test\Zip_004\" Size: 188MB

    Folder: "F:\zip_test\Zip_005" Moved: "F:\zip_test\0056.zip" ".\Zip_005" Moved: "F:\zip_test\0035.zip" ".\Zip_005" Moved: "F:\zip_test\0036.zip" ".\Zip_005" Folder: "F:\zip_test\Zip_005\" Size: 189MB

    Folder: "F:\zip_test\Zip_006" Moved: "F:\zip_test\0055.zip" ".\Zip_006" Moved: "F:\zip_test\0059.zip" ".\Zip_006" Moved: "F:\zip_test\0110.zip" ".\Zip_006" Moved: "F:\zip_test\0135.zip" ".\Zip_006" Folder: "F:\zip_test\Zip_006\" Size: 191MB

    Folder: "F:\zip_test\Zip_007" Moved: "F:\zip_test\0049.zip" ".\Zip_007" Moved: "F:\zip_test\0052.zip" ".\Zip_007" Moved: "F:\zip_test\0062.zip" ".\Zip_007" Moved: "F:\zip_test\0070.zip" ".\Zip_007" Folder: "F:\zip_test\Zip_007\" Size: 190MB

    Folder: "F:\zip_test\Zip_008" Moved: "F:\zip_test\0011.zip" ".\Zip_008" Moved: "F:\zip_test\0074.zip" ".\Zip_008" Moved: "F:\zip_test\0069.zip" ".\Zip_008" Moved: "F:\zip_test\0100.zip" ".\Zip_008" Moved: "F:\zip_test\0077.zip" ".\Zip_008" Folder: "F:\zip_test\Zip_008\" Size: 191MB

    Folder: "F:\zip_test\Zip_009" Moved: "F:\zip_test\0155.zip" ".\Zip_009" Moved: "F:\zip_test\0119.zip" ".\Zip_009" Moved: "F:\zip_test\0032.zip" ".\Zip_009" Moved: "F:\zip_test\0060.zip" ".\Zip_009" Moved: "F:\zip_test\0085.zip" ".\Zip_009" Folder: "F:\zip_test\Zip_009\" Size: 191MB

    Folder: "F:\zip_test\Zip_010" Moved: "F:\zip_test\0083.zip" ".\Zip_010" Moved: "F:\zip_test\0173.zip" ".\Zip_010" Moved: "F:\zip_test\0017.zip" ".\Zip_010" Moved: "F:\zip_test\0050.zip" ".\Zip_010" Moved: "F:\zip_test\0158.zip" ".\Zip_010" Moved: "F:\zip_test\0079.zip" ".\Zip_010" Folder: "F:\zip_test\Zip_010\" Size: 191MB

    Folder: "F:\zip_test\Zip_011" Moved: "F:\zip_test\0107.zip" ".\Zip_011" Moved: "F:\zip_test\0001.zip" ".\Zip_011" Moved: "F:\zip_test\0008.zip" ".\Zip_011" Moved: "F:\zip_test\0031.zip" ".\Zip_011" Moved: "F:\zip_test\0167.zip" ".\Zip_011" Moved: "F:\zip_test\0144.zip" ".\Zip_011" Folder: "F:\zip_test\Zip_011\" Size: 186MB

    Folder: "F:\zip_test\Zip_012" Moved: "F:\zip_test\0104.zip" ".\Zip_012" Moved: "F:\zip_test\0065.zip" ".\Zip_012" Moved: "F:\zip_test\0118.zip" ".\Zip_012" Moved: "F:\zip_test\0142.zip" ".\Zip_012" Moved: "F:\zip_test\0143.zip" ".\Zip_012" Moved: "F:\zip_test\0102.zip" ".\Zip_012" Moved: "F:\zip_test\0149.zip" ".\Zip_012" Folder: "F:\zip_test\Zip_012\" Size: 184MB

    Folder: "F:\zip_test\Zip_013" Moved: "F:\zip_test\0148.zip" ".\Zip_013" Moved: "F:\zip_test\0117.zip" ".\Zip_013" Moved: "F:\zip_test\0145.zip" ".\Zip_013" Moved: "F:\zip_test\0087.zip" ".\Zip_013" Moved: "F:\zip_test\0114.zip" ".\Zip_013" Moved: "F:\zip_test\0116.zip" ".\Zip_013" Moved: "F:\zip_test\0127.zip" ".\Zip_013" Moved: "F:\zip_test\0103.zip" ".\Zip_013" Folder: "F:\zip_test\Zip_013\" Size: 191MB

    Folder: "F:\zip_test\Zip_014" Moved: "F:\zip_test\0076.zip" ".\Zip_014" Moved: "F:\zip_test\0162.zip" ".\Zip_014" Moved: "F:\zip_test\0111.zip" ".\Zip_014" Moved: "F:\zip_test\0007.zip" ".\Zip_014" Moved: "F:\zip_test\0006.zip" ".\Zip_014" Moved: "F:\zip_test\0129.zip" ".\Zip_014" Moved: "F:\zip_test\0067.zip" ".\Zip_014" Moved: "F:\zip_test\0109.zip" ".\Zip_014" Folder: "F:\zip_test\Zip_014\" Size: 186MB

    Folder: "F:\zip_test\Zip_015" Moved: "F:\zip_test\0016.zip" ".\Zip_015" Moved: "F:\zip_test\0113.zip" ".\Zip_015" Moved: "F:\zip_test\0147.zip" ".\Zip_015" Moved: "F:\zip_test\0150.zip" ".\Zip_015" Moved: "F:\zip_test\0019.zip" ".\Zip_015" Moved: "F:\zip_test\0018.zip" ".\Zip_015" Moved: "F:\zip_test\0160.zip" ".\Zip_015" Moved: "F:\zip_test\0136.zip" ".\Zip_015" Moved: "F:\zip_test\0038.zip" ".\Zip_015" Folder: "F:\zip_test\Zip_015\" Size: 190MB

    Folder: "F:\zip_test\Zip_016" Moved: "F:\zip_test\0028.zip" ".\Zip_016" Moved: "F:\zip_test\0005.zip" ".\Zip_016" Moved: "F:\zip_test\0168.zip" ".\Zip_016" Moved: "F:\zip_test\0138.zip" ".\Zip_016" Moved: "F:\zip_test\0009.zip" ".\Zip_016" Moved: "F:\zip_test\0010.zip" ".\Zip_016" Moved: "F:\zip_test\0088.zip" ".\Zip_016" Moved: "F:\zip_test\0161.zip" ".\Zip_016" Moved: "F:\zip_test\0093.zip" ".\Zip_016" Moved: "F:\zip_test\0066.zip" ".\Zip_016" Folder: "F:\zip_test\Zip_016\" Size: 187MB

    Folder: "F:\zip_test\Zip_017" Moved: "F:\zip_test\0166.zip" ".\Zip_017" Moved: "F:\zip_test\0152.zip" ".\Zip_017" Moved: "F:\zip_test\0151.zip" ".\Zip_017" Moved: "F:\zip_test\0043.zip" ".\Zip_017" Moved: "F:\zip_test\0153.zip" ".\Zip_017" Moved: "F:\zip_test\0082.zip" ".\Zip_017" Moved: "F:\zip_test\0081.zip" ".\Zip_017" Moved: "F:\zip_test\0096.zip" ".\Zip_017" Moved: "F:\zip_test\0171.zip" ".\Zip_017" Moved: "F:\zip_test\0163.zip" ".\Zip_017" Moved: "F:\zip_test\0097.zip" ".\Zip_017" Folder: "F:\zip_test\Zip_017\" Size: 186MB

    Folder: "F:\zip_test\Zip_018" Moved: "F:\zip_test\0098.zip" ".\Zip_018" Moved: "F:\zip_test\0063.zip" ".\Zip_018" Moved: "F:\zip_test\0080.zip" ".\Zip_018" Moved: "F:\zip_test\0053.zip" ".\Zip_018" Moved: "F:\zip_test\0061.zip" ".\Zip_018" Moved: "F:\zip_test\0094.zip" ".\Zip_018" Moved: "F:\zip_test\0095.zip" ".\Zip_018" Moved: "F:\zip_test\0106.zip" ".\Zip_018" Moved: "F:\zip_test\0159.zip" ".\Zip_018" Moved: "F:\zip_test\0172.zip" ".\Zip_018" Moved: "F:\zip_test\0090.zip" ".\Zip_018" Moved: "F:\zip_test\0078.zip" ".\Zip_018" Moved: "F:\zip_test\0120.zip" ".\Zip_018" Moved: "F:\zip_test\0073.zip" ".\Zip_018" Folder: "F:\zip_test\Zip_018\" Size: 191MB

    Folder: "F:\zip_test\Zip_019" Moved: "F:\zip_test\0137.zip" ".\Zip_019" Moved: "F:\zip_test\0002.zip" ".\Zip_019" Moved: "F:\zip_test\0037.zip" ".\Zip_019" Moved: "F:\zip_test\0020.zip" ".\Zip_019" Moved: "F:\zip_test\0027.zip" ".\Zip_019" Moved: "F:\zip_test\0004.zip" ".\Zip_019" Moved: "F:\zip_test\0124.zip" ".\Zip_019" Moved: "F:\zip_test\0123.zip" ".\Zip_019" Moved: "F:\zip_test\0122.zip" ".\Zip_019" Moved: "F:\zip_test\0125.zip" ".\Zip_019" Moved: "F:\zip_test\0164.zip" ".\Zip_019" Moved: "F:\zip_test\0126.zip" ".\Zip_019" Moved: "F:\zip_test\0112.zip" ".\Zip_019" Moved: "F:\zip_test\0146.zip" ".\Zip_019" Moved: "F:\zip_test\0025.zip" ".\Zip_019" Moved: "F:\zip_test\0024.zip" ".\Zip_019" Folder: "F:\zip_test\Zip_019\" Size: 187MB

    Folder: "F:\zip_test\Zip_020" Moved: "F:\zip_test\0046.zip" ".\Zip_020" Moved: "F:\zip_test\0048.zip" ".\Zip_020" Moved: "F:\zip_test\0047.zip" ".\Zip_020" Moved: "F:\zip_test\0045.zip" ".\Zip_020" Moved: "F:\zip_test\0044.zip" ".\Zip_020" Moved: "F:\zip_test\0033.zip" ".\Zip_020" Moved: "F:\zip_test\0068.zip" ".\Zip_020" Moved: "F:\zip_test\0026.zip" ".\Zip_020" Moved: "F:\zip_test\0141.zip" ".\Zip_020" Moved: "F:\zip_test\0022.zip" ".\Zip_020" Moved: "F:\zip_test\0021.zip" ".\Zip_020" Moved: "F:\zip_test\0023.zip" ".\Zip_020" Moved: "F:\zip_test\0099.zip" ".\Zip_020" Moved: "F:\zip_test\0133.zip" ".\Zip_020" Moved: "F:\zip_test\0157.zip" ".\Zip_020" Moved: "F:\zip_test\0034.zip" ".\Zip_020" Moved: "F:\zip_test\0165.zip" ".\Zip_020" Moved: "F:\zip_test\0029.zip" ".\Zip_020" Folder: "F:\zip_test\Zip_020\" Size: 185MB

    Folder: "F:\zip_test\Zip_021" Moved: "F:\zip_test\0064.zip" ".\Zip_021" Moved: "F:\zip_test\0042.zip" ".\Zip_021" Moved: "F:\zip_test\0121.zip" ".\Zip_021" Moved: "F:\zip_test\0003.zip" ".\Zip_021" Moved: "F:\zip_test\0041.zip" ".\Zip_021" Moved: "F:\zip_test\0092.zip" ".\Zip_021" Moved: "F:\zip_test\0101.zip" ".\Zip_021" Moved: "F:\zip_test\0154.zip" ".\Zip_021" Moved: "F:\zip_test\0169.zip" ".\Zip_021" Moved: "F:\zip_test\0170.zip" ".\Zip_021" Moved: "F:\zip_test\0040.zip" ".\Zip_021" Moved: "F:\zip_test\0134.zip" ".\Zip_021" Moved: "F:\zip_test\0130.zip" ".\Zip_021" Moved: "F:\zip_test\0131.zip" ".\Zip_021" Moved: "F:\zip_test\0132.zip" ".\Zip_021" Folder: "F:\zip_test\Zip_021\" Size: 128MB


  • Note pertinente :

Obs.. : 1 Vous devez/voulez tester cela d'abord, je suggère d'utiliser un autre dossier de moins de 1 Go (total) de fichiers pour vérifier si cela fonctionne, ou si cela nécessite quelques ajustements.

Obs.. : 2 Gardez à l'esprit que Windows travaille toujours à faire beaucoup de choses en arrière-plan aussi, et va "rafraîchir" ces fichiers et dossiers, de temps en temps, faites attention pour prévenir les erreurs possibles (voir le message ci-dessous), exécutez cette batte sans l'explorateur Windows a de votre dossier zip ouvert

Obs.. : 3 Lire attentivement Obs.. : 1 y Obs.. : 2 plus une fois avant d'essayer de tester ceci pour éviter le message suivant :

Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus.


SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X