
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:
Os nomes das subpastas devem ser criados de acordo com a seguinte nomenclatura: 001, 002, 003 e assim por diante.
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.).
Deve suportar a movimentação de dezenas de milhares de arquivos.
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