Script em lote para mover arquivos da pasta pai para subpastas em lotes de quantidade especificada

1

Eu preciso de um script de arquivo em lotes para mover todos os arquivos de uma única pasta pai para quantas subpastas forem necessárias, contanto que cada subpasta receba a quantidade máxima de arquivos especificados no arquivo em lotes 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ários arquivos X (onde X "é a quantidade de arquivos que cada subpasta receberá.

Requisitos extras:

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

  2. Deve suportar arquivos com todos os tipos de nomes de arquivos (com espaços, com caracteres especiais ou acentuação não inglesa, etc.).

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

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

Por exemplo, digamos que a pasta "D: \ Downloads" tenha 2400 arquivos, e que você queira distribuí-los em subpastas contendo até 1000 arquivos cada. Depois de executar o script, a seguinte estrutura será criada:

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 (que arquivo vai para qual subpasta) não é importante, ou seja, a movimentação não precisará levar nenhum critério específico em consideração (como nome do arquivo, tamanho, tipo de arquivo, etc.). No entanto, qualquer melhoria neste aspecto será bem-vinda (por exemplo, a opção de mover primeiro os últimos arquivos criados para as primeiras subpastas).

Alguma idéia?

ATUALIZAÇÃO

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%
D:\Downloads
       |__001
       |__002
       |__003
!nf! ) :: Move files into subfolders with names starting with "00...": MOVE /-Y "%%f" %1%
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
!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
    
por Rodrigo Faustini 21.08.2018 / 22:31

0 respostas

-1

Agora, o que posso fazer é mover os primeiros 1000 arquivos para a subpasta e criar a subpasta.

@echo off

set Source=C:\abc
set Target1=C:
@echo off

set Source=C:\abc
set Target1=C:%pre%1
set Target2=C:%pre%2
set Target1=C:%pre%3

set MaxLimit=1000

if not exist "C:%pre%1\" mkdir C:%pre%1
if not exist "C:%pre%2\" mkdir C:%pre%2
if not exist "C:%pre%3\" mkdir C:%pre%3

for /f "tokens=1* delims=[]" %%G in ('dir /A-D /B "%Source%\*.*" ^| find /v /n ""') do (
    move  "%Source%\%%~nxH" "%Target1%"
    if %%G==%MaxLimit% exit /b 0
)
1 set Target2=C:%pre%2 set Target1=C:%pre%3 set MaxLimit=1000 if not exist "C:%pre%1\" mkdir C:%pre%1 if not exist "C:%pre%2\" mkdir C:%pre%2 if not exist "C:%pre%3\" mkdir C:%pre%3 for /f "tokens=1* delims=[]" %%G in ('dir /A-D /B "%Source%\*.*" ^| find /v /n ""') do ( move "%Source%\%%~nxH" "%Target1%" if %%G==%MaxLimit% exit /b 0 )

O outro 1000 e os últimos 400, eu não consegui. Então eu coloquei o primeiro código 1000.

Altere o caminho da pasta pai e o caminho da subpasta.

Espero que possa ajudá-lo. Qualquer edição será ótima.

    
por 22.08.2018 / 04:52