
Como mover arquivos para uma pasta até atingir um determinado tamanho no Windows?
Responder1
Script em lote
Aqui está um script que faz exatamente isso. Possui quatro parâmetros, sendo o último opcional: a pasta de origem; a pasta de destino; o tamanho do destino em bytes; as extensões de arquivo que devem ser correspondidas. Todos os parâmetros, exceto o tamanho, exigem cotações.
@echo off
setlocal
setlocal enabledelayedexpansion
if "%~3" == "" exit /b 3
if "%~2" == "" exit /b 2
pushd "%~1" 2>nul || exit /b 4
pushd "%~2" 2>nul && popd || exit /b 5
set target=%~3
set /a target=%target:~0,-3% 2>nul || exit /b 6
set /a min=%target% / 1000
for /r "%~2" %%G in (*) do (
set size=%%~zG
set /a size=!size:~0,-3! 2>nul
if !errorlevel! equ 0 (
if !size! gtr !target! exit /b 7
set /a target -= !size!
))
if %target% leq %min% goto :end
set exts=* & if not "%~4" == "" set exts=%~4
for /f "delims=" %%G in ('dir %exts% /a:-d-h-s /b /o:-s 2^>nul') do (
if !target! leq %min% goto :end
set size=%%~zG
set /a size=!size:~0,-3! 2>nul
if !errorlevel! equ 0 if !size! leq !target! (
echo n 2>nul|move /-y "%%~fG" "%~2" >nul 2>&1 && set /a target -= !size!
))
:end
popd
endlocal & exit /b 0
Como funciona
As primeiras linhas garantem que a quantidade de parâmetros esteja correta. Cada parâmetro é validado para rejeitar pastas inexistentes e/ou valores de tamanho incorretos. Para evitar estouro de número inteiro, os últimos três dígitos do tamanho do destino são truncados. Um valor limite é definido como 1/1000 da meta para fornecer alguma tolerância.
Para contabilizar os arquivos existentes, o conteúdo da pasta de destino é verificado e seu tamanho total é calculado. O valor resultante é subtraído do tamanho alvo.
Neste ponto, o trabalho propriamente dito começa: o conteúdo da pasta de origem é enumerado e classificado por tamanho de arquivo, do maior para o menor. Os arquivos são movidos somente quando seu tamanho é menor ou igual ao destino atual, que é então atualizado. Essebusca gananciosacontinue até que não haja mais arquivos ou o limite mínimo seja atingido, o que ocorrer primeiro.
Observações
O interpretador de comandos usa 32 bitsinteiros assinadospara realizar operações aritméticas, portanto, o maior valor positivo é
2^31 - 1 = 2147483647
.O tamanho de destino pode ser qualquer valor (em bytes) entre 1 KB e 2 TB.
Arquivos com o conjunto de atributos Oculto ou Sistema são ignorados.
Caso a pasta de origem contenha um ou mais arquivos que já estejam presentes na pasta de destino, a operação de movimentação será ignorada para evitar possível perda de dados.
Por motivos de desempenho, o script usou um valor armazenado em cache em vez de enumerar arquivos em cada etapa para encontrar o tamanho da pasta de destino. Os arquivos que são ignorados porque compartilham o mesmo nome ainda serão somados ao total, e o tamanho resultante pode ser distorcido.
As subpastas não são processadas. Se necessário, adicione o
/s
parâmetro aodir
comando. Como a estrutura de origem fica nivelada, você pode acabar com arquivos com nomes idênticos que não seriam movidos para o destino.
Leitura adicional
Responder2
Com Powershell.
Fazer (a movimentação dos arquivos de uma pasta para outra) enquanto (o tamanho da pasta não é o desejável)
Usaresta demonstração sobre como usar o loop do whilee altere o script de eco pelos scripts acima para atender às suas necessidades.