Script em lote para mover arquivos da pasta pai para subpastas em quantidades especificadas

Script em lote para mover arquivos da pasta pai para subpastas em quantidades especificadas

Preciso de um script de arquivo em lote para mover todos os arquivos de uma única pasta pai para quantas subpastas forem necessárias, desde que cada subpasta receba a quantidade máxima de arquivos especificada no arquivo em lote ou na linha de comando. Em outras palavras, o script deve distribuir todos os arquivos da pasta pai em várias subpastas abaixo dela (que o script deve criar automaticamente), movendo os arquivos em váriosXarquivos (onde "X"é a quantidade de arquivos que cada subpasta receberá).

Requisitos extras:

  1. Os nomes das subpastas devem ser criados de acordo com a seguinte nomenclatura: 001, 002, 003 e assim por diante.

  2. Deve suportar arquivos com todos os tipos de nomes de arquivo (com espaços, com caracteres especiais ou acentuação diferente do inglês, etc.).

  3. Deve suportar a movimentação de dezenas de milhares de arquivos.

  4. Deve funcionar no Windows 10 Professional com direitos de administrador local.

Por exemplo, digamos que a pasta "D:\Downloads" contém 2.400 arquivos e que você deseja distribuí-los em subpastas contendo até 1.000 arquivos cada. Após a execução do script, será criada a seguinte estrutura:

D:\Downloads
       |__001
       |__002
       |__003

Onde:

D:\Downloads --> Will have no files inside it anymore
       |__001 --> Will have 1000 files inside it
       |__002 --> Will have 1000 files inside it
       |__003 --> Will have the last 400 files inside it

A ordem dos arquivos (qual arquivo vai para qual subpasta) não é importante, ou seja, a movimentação não precisará levar em consideração nenhum critério específico (como nome do arquivo, tamanho, tipo de arquivo, etc.). No entanto, quaisquer melhorias neste aspecto serão bem-vindas (por exemplo, a opção de mover primeiro os últimos arquivos criados para as primeiras subpastas).

Alguma ideia?


ATUALIZAR

Aqui está a solução que funcionou para mim:

@echo off
setlocal enableextensions
setlocal enabledelayedexpansion

if not %3.==. goto syntax
if %2.==. goto syntax
:: Checks if %2 is a number:
SET "var="&for /f "delims=0123456789" %%i in ("%2") do set var=%%i
if defined var (goto syntax) 
if /i %1.==. goto syntax
if /i not exist %1 echo. & echo  The folder %1 does not exist... && echo  Folder paths must be typed between "quotes" if there's any empty space. && echo. && goto end

setlocal enableextensions
setlocal enabledelayedexpansion
:: Maximum amount of files per subfolder:
SET limit=%2
:: Initial counter (everytime counter is 1, a new subfolder is created):
SET n=1
:: Subfolder counter:
SET nf=0
::Retrieves the amount of files in the specified folder:
set count=0
for %%A in (%1%\*.*) do set /a count+=1
echo.
echo  Distributing %count% files in subfolders of up to %2 files...
FOR %%f IN (%1%\*.*) DO (
  :: If counter is 1, create a new subfolder with name starting with "00...":
  IF !n!==1 (
    SET /A nf+=1
    MD %1%\00!nf!
  )
  :: Move files into subfolders with names starting with "00...":
  MOVE /-Y "%%f" %1%\00!nf! > NUL
  :: Reset counter when a subfolder reaches the maximum file limit:
  IF !n!==!limit! (
    SET n=1
  ) ELSE (
    SET /A n+=1
  )
)
SET limit=
SET n=
SET nf=
SET count=
echo  Move finished successfully.
goto end

:syntax
echo.
echo  YOU TYPED: movedown %*
echo  SYNTAX: movedown ["full path"] (between quotes if there's any space) [n] (maximum number of files per subfolder)
echo.
:end
ENDLOCAL

informação relacionada