Mover um grande número de arquivos de um diretório para vários diretórios
-
23-09-2019 - |
Pergunta
Estou procurando criar um script em lote do Windows para mover cerca de 2.000 arquivos e dividi-los para que haja 10 arquivos por pasta.Tentei criar um script em lote, mas a sintaxe realmente me confunde.Aqui está o que tenho até agora
@echo off
:: Config parameters
set /a groupsize = 10
:: initial counter, everytime counter is 1, we create new folder
set /a n = 1
:: folder counter
set /a nf = 1
for %%f in (*.txt) do (
:: if counter is 1, create new folder
if %n% == 1 (
md folder%nf%
set /a n += 1
)
:: move file into folder
mv -Y %%f folder%nf%\%%f
:: reset counter if larger than group size
if %n% == %groupsize% (
set /a n = 1
) else (
set /a n += 1
)
)
pause
Basicamente, o que esse script faz é percorrer cada arquivo .txt no diretório.Ele cria um novo diretório no início e move 10 arquivos para esse diretório, depois cria uma nova pasta novamente e move outros 10 arquivos para esse diretório e assim por diante.No entanto, estou tendo problemas onde o n
variável não está sendo incrementada no loop?Tenho certeza de que há outros erros também, já que a janela do CMD fecha para mim mesmo com pause
.Qualquer ajuda ou orientação será apreciada, obrigado pelo seu tempo!
Solução
Algumas coisas que você precisa saber:
SETLOCAL ENABLEDELAYEDEXPANSION
é necessário, já que você está alterando variáveis e usando seus valores alterados em um único bloco entre parênteses.SET /?
na linha de comando fornecerá algumas informações.Pesquise esse termo na internet e você encontrará uma explicação melhor.- Os lugares que uso
!nf!
o formato das variáveis está relacionado à expansão atrasada. - Como ghostdog74 mencionou, você não estava incrementando
%nf%
. - eu inicializei
nf
para 0 em vez de 1.Dessa forma, o número da pasta para a qual você deseja mover os arquivos é igual ao número da pasta que você acabou de criar.No seu código, você cria a pastaX, incrementa X e tenta mover o arquivo para X+1. - Você tem que usar
MOVE
para mover um arquivo,MV
não é válido.
Este arquivo em lote funciona... mas certifique-se de testar!Testei apenas em uma pequena quantidade de arquivos.
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
:: Config parameters
SET groupsize=10
:: initial counter, everytime counter is 1, we create new folder
SET n=1
:: folder counter
SET nf=0
FOR %%f IN (*.txt) DO (
:: if counter is 1, create new folder
IF !n!==1 (
SET /A nf+=1
MD folder!nf!
)
:: move file into folder
MOVE /Y "%%f" folder!nf!
:: reset counter if larger than group size
IF !n!==!groupsize! (
SET n=1
) ELSE (
SET /A n+=1
)
)
ENDLOCAL
PAUSE
Outras dicas
você não está incrementando %nf%
.