Как переместить файлы в папку, пока она не достигнет определенного размера в Windows?
2 ответа
Пакетный скрипт
Вот скрипт, который делает именно это. Он имеет четыре параметра, последний из которых является необязательным: исходная папка; папка назначения; целевой размер в байтах; расширения файлов, которые должны соответствовать. Все параметры кроме размера требуют кавычек.
@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
Как это устроено
Первые строки гарантируют, что количество параметров является правильным. Каждый параметр проверяется, чтобы отклонить несуществующие папки и / или неверные значения размера. Чтобы избежать целочисленного переполнения, последние 3 цифры целевого размера усекаются. Пороговое значение устанавливается на 1/1000 от цели, чтобы обеспечить некоторый допуск.
Чтобы учесть существующие файлы, содержимое целевой папки сканируется и вычисляется ее общий размер. Полученное значение вычитается из целевого размера.
В этот момент начинается настоящая работа: содержимое исходной папки нумеруется и сортируется по размеру файла, от самого большого до самого маленького. Файлы перемещаются только тогда, когда их размер меньше или равен текущей цели, которая затем обновляется. Этот жадный поиск продолжается до тех пор, пока не останется больше файлов или не будет достигнут минимальный порог, в зависимости от того, что наступит раньше.
замечания
Интерпретатор команд использует 32-битные целые числа со знаком для выполнения арифметических операций, поэтому наибольшее положительное значение равно
2^31 - 1 = 2147483647
.Целевой размер может быть любым значением (в байтах) от 1 КБ до 2 ТБ.
Файлы с установленным атрибутом Скрытый или Системный игнорируются.
Если исходная папка содержит один или несколько файлов, которые уже присутствуют в целевой папке, операция перемещения будет пропущена во избежание возможной потери данных.
Из соображений производительности сценарий использовал кэшированное значение, а не перечислял файлы на каждом шаге, чтобы найти размер целевой папки. Файлы, которые пропускаются из-за того, что они имеют одно и то же имя, все равно будут суммироваться, и результирующий размер может быть искажен в результате.
Подпапки не обрабатываются. Если вам нужно, добавьте параметр
/s
в командуdir
. Поскольку исходная структура становится плоской, вы можете получить идентичные именованные файлы, которые не будут перемещены в место назначения.
дальнейшее чтение
С Powershell.
Делать (перемещение файлов из папки в другую) пока (размер папки не желателен)
Используйте эту демонстрацию о том, как использовать цикл do while и измените сценарий echo с помощью приведенных выше сценариев в соответствии с вашими потребностями.