Разнести файлы по папкам, заполняя их до заданного размера

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
Чиполлино
Сообщения: 62
Зарегистрирован: Пт дек 22, 2017 23:44
Откуда: Орёл

Сообщение Чиполлино »

Скажите, а можно сделать аналогично, но не по указанному размеру, а указанному количеству (штук) файлов, в создаваемых номерных папках?
Просто раскидать файлы по номерным папкам, например, по 10000 штук.
Формат файлов одинаковый.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Чиполлино
Можно, если ещё потрудиться поискать, а не лезть в первую попавшуюся тему с фразой "разнести файлы" (1-2-3, 4).
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Bronseva
Сообщения: 2
Зарегистрирован: Чт дек 15, 2022 20:28

Сообщение Bronseva »

Flasher писал(а):А пока быстро набросал предварительный вариант с обычным перемещением:
Благодарю, этот скрипт очень помог. Однако выполнение его протекало не вполне ожидаемым образом. Поскольку я не знаю ничего о скриптах, кроме совсем базовых вещей типа «создать кнопку и повесить на неё вот этот VBA с параметром», что именно в нём поправить, чтобы работал как предполагается, я не сообразил.

Задача:
Приблизительно 35 тысяч файлов расположены в одной папке без подкаталогов, общий размер порядка 370 Гб.
Нужно перемещением раскидать эти файлы в подпапки, которые будут создаваться здесь же.
Максимальный размер получаемой подпапки не должен превышать 4 Гб.

Как я понял, %WL "<путь получателя>" <верхний лимит размера папок в Мб> нужно использовать в параметре кнопки на панели TC, поэтому я нажал «изменить» кнопку и в поле «параметр» вбил:

Код: Выделить всё

%WL "%T" 4000
Далее все файлы распределились по десяти папкам, и каждая папка весит примерно по 35-40 Гб. Я перепроверил — в скрипте идёт Sum = .Item(2) * 1048576, то есть при параметре 4000 должно получаться 4 Гб, но не 40 Гб. Переместил файлы обратно, и попробовал для проверки разместить их теперь с параметром:

Код: Выделить всё

%WL "%T" 400
К моему удивлению результат был идентичным — все файлы спокойно распределялись ровно по тем же десяти 40 Гб папкам с номерами от 0 до 9 включительно. Зашел в получившуюся подпапку с ~3500 файлами и применил тот же скрипт с той же настройкой. К моему повторному удивлению, я получил новые 10 папок, которые на этот раз имели правильный размер, укладывающийся в 4 Гб. Не имея возможности разобраться со скриптом с разбегу, я провернул данную операцию ещё девять раз и в итоге получил 90 папок, не превышающих размером 4 Гб.

Ни один файл не потерялся, задача была выполнена успешно, всё проверено несколько раз. Но недоумение осталось: либо я не понял, и в спойлере, откуда я скопировал скрипт, расположен какой-то другой скрипт, не разбрасывающий файлы по папкам заданного размера, либо я совсем не понял.

Есть определённые подозрения о появляющихся 10 папках. Каждый раз их было десять. На другом наборе данных, например 23 файла по 1-3 Гб, скрипт с теми же параметрами создаёт всё те же 10 папок и аккуратно разбрасывает файлы по всем десяти. Ещё на одном наборе данных — 293 файла на 97 Гб, размером от 1 Кб до 6 Гб — скрипт снова раскидывает всё по десяти папкам. Чувствую себя в лыжах.

Код взят без изменений из спойлера вот в шестом сообщении текущей темы и сохранён как 'названиефайла.vbs'. Моя задача успешно выполнена, но осталось любопытство — что я сделал не так, или чего не понял.

ПС. Регистрация на форуме что-то поломалась, и на gmail не приходит письмо с активацией, спам проверил, разумеется. Не смог найти списка проблем с регистрацией или ограничений, но догадался попробовать ещё и с яндекс-почты, там пришло мгновенно. Возможно что-то где-то отвалилось или если есть ограничение на провайдеров, об этом стоило бы написать в форме регистрации, сейчас этого нет. Также при ошибке регистрации предлагается «написать администратору», спешу уведомить, что без регистрации на форуме написать администратору негде и некуда, если у пользователя нет аккаунта на форуме. ICQ, наверное, не имеет смысл считать актуальным методом связи, хотя он указан у пары модераторов в профиле.

[mod="CaptainFlint"]Оживил ссылку.
По поводу связи с администратором: замечание справедливое, подредактировал сообщение, добавив туда email-ссылку.
Что касается gmail, то со стороны форума никаких ограничений нет. Если их сервер отказывается принимать почту, мы ничего не можем с этим поделать, равно как и с любым другим почтовым сервисом.[/mod]
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Bronseva
Выход из положения без правки алгоритма: увеличьте в шапке скрипта константу Num (минимальное число цифр в именах создаваемых папок) c 1 до 2 или 3 (или большего значения в зависимости от числа создаваемых папок).
Аватара пользователя
Bronseva
Сообщения: 2
Зарегистрирован: Чт дек 15, 2022 20:28

Сообщение Bronseva »

sa
Благодарю, на актуальном проекте проверить уже не мог, но на «кошках» работает — для упомянутого выше набора данных из 293 файлов ~97 Гб, размером от 1 Кб до 6 Гб скрипт создал 26 папок, раскидав по ним файлы в пределах задаваемого потолка в 4 Гб — %WL "%T" 4000.

Что интересно, несколько папок превышают этот размер, в случае когда перемещаемый файл имеет размер больший, чем поставленное ограничение, тогда он в папке один. В общем, скрипт для моей задачи подходит, и всё работает, насколько я могу судить.
Ответить