
¿Cómo mover archivos a una carpeta hasta que alcance cierto tamaño en Windows?
Respuesta1
secuencia de comandos por lotes
Aquí hay un guión que hace precisamente eso. Tiene cuatro parámetros, siendo el último opcional: la carpeta de origen; la carpeta de destino; el tamaño objetivo en bytes; las extensiones de archivo que deben coincidir. Todos los parámetros excepto el tamaño requieren comillas.
@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
Cómo funciona
Las primeras líneas aseguran que la cantidad de parámetros sea correcta. Cada parámetro se valida para rechazar carpetas no existentes y/o valores de tamaño incorrectos. Para evitar el desbordamiento de enteros, se truncan los últimos 3 dígitos del tamaño objetivo. Se establece un valor umbral en 1/1000 del objetivo para proporcionar cierta tolerancia.
Para tener en cuenta los archivos existentes, se escanea el contenido de la carpeta de destino y se calcula su tamaño total. El valor resultante se resta del tamaño objetivo.
En este punto comienza el trabajo real: el contenido de la carpeta de origen se enumera y ordena por tamaño de archivo, de mayor a menor. Los archivos se mueven sólo cuando su tamaño es menor o igual al objetivo actual, que luego se actualiza. Estebúsqueda codiciosacontinúe hasta que no haya más archivos o se alcance el umbral mínimo, lo que ocurra primero.
Observaciones
El intérprete de comandos utiliza 32 bits.enteros con signopara realizar operaciones aritméticas, por lo tanto, el valor positivo más alto es
2^31 - 1 = 2147483647
.El tamaño de destino puede ser cualquier valor (en bytes) entre 1 KB y 2 TB.
Los archivos con el conjunto de atributos Oculto o Sistema se ignoran.
En caso de que la carpeta de origen contenga uno o más archivos que ya estén presentes en la carpeta de destino, se omitirá la operación de movimiento para evitar una posible pérdida de datos.
Por motivos de rendimiento, el script utilizó un valor almacenado en caché en lugar de enumerar archivos en cada paso para encontrar el tamaño de la carpeta de destino. Los archivos que se omiten porque comparten el mismo nombre se sumarán al total y el tamaño resultante puede verse sesgado.
Las subcarpetas no se procesan. Si es necesario, agregue el
/s
parámetro aldir
comando. Dado que la estructura de origen se aplana, es posible que termine con archivos con nombres idénticos que no se moverían al destino.
Otras lecturas
Respuesta2
Con Powershell.
Hacer (el movimiento de los archivos de una carpeta a otra) mientras (el tamaño de la carpeta no es el deseable)
Usaresta demostración sobre cómo usar el bucle do whiley cambie el script de eco con los scripts anteriores para adaptarlo a sus necesidades.