Перемещение нужного количества файлов по папкам

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

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

Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Перемещение нужного количества файлов по папкам

Сообщение Andrey_A »

Всем форумчанам привет!
Задача такая: в папке есть кучу файлов. Необходимо переместить их в папки по 50 штук в каждую. Панель создания папок не важна - можно в эту же. Имена папок - тоже (001, 002....). Я пытался сам сделать батник или скрипт, но не получается. Желательно, чтобы в параметрах было 50 (т.е. число перемещаемых файлов можно было бы задать).
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Если папки уже существуют, то...
Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Сообщение Andrey_A »

Tol!k это немного не то. Дополнительных Папок никаких нет, есть папка с файлами, имена у которых различны. Необходимо их распределить...
Можно их всех до батника выделить (параметры будут %l 50)
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Сообщение Andrey_A »

Вахмурка, и чем это поможет? Ты предлогаешь выделять вручную? В папке 56 тыс файлов... И таких не мало
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

Чем богаты...
Просто не приходилось сталкиваться с такой проблемой.
Возможно, сама идея отправки сообщений окну Тотала может показаться продуктивной. Далее процесс можно автоматизировать: создал директорию - послал сообщение - выделил файлы - переместил - создал директорию... По крайней мере, иных идей автоматизации у меня нет.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Samwatas
Сообщения: 95
Зарегистрирован: Сб сен 12, 2009 20:26

Сообщение Samwatas »

А нужно ВСЕ файлы в папке обрабатывать?
Аватара пользователя
Batya
Сообщения: 2237
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Andrey_A
vbs-скрипт:

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

'======================================================================
' Копирование выделенных файлов\папок по заданному количеству
'   в отдельные (создаваемые) папки

' Параметры:
' {файл-список} {целевая папка} {количество}

' Пример параметров вызова из TC:
' %L "%T" 50
'======================================================================
Option Explicit
'================= Изменяемые параметры ===============================
Const Rank = 3  'Минимальное количество цифр в создаваемых папках
'======================================================================
Dim FSO, FileList, List, F, Folder, Count, i, n, Path
Set FSO  = CreateObject("Scripting.FileSystemObject")
FileList = WScript.Arguments(0)
Folder   = WScript.Arguments(1)
Count    = CInt(WScript.Arguments(2))
List     = Split(FSO.OpenTextFile(FileList).ReadAll, vbNewLine)
If Right(Folder, 1) <> "\" Then Folder = Folder & "\"
n = 1
i = Count
For Each F In List
  If F <> "" Then
    If i >= Count Then
      If Len(CStr(n)) < Rank Then
        Path = Folder & Right(String(Rank, "0") & CStr(n), Rank) & "\"
      Else
        Path = Folder & CStr(n) & "\"
      End If
      If Not FSO.FolderExists(Path) Then FSO.CreateFolder(Path)
      i = 1
      n = n + 1
    Else
      i = i + 1
    End If
    If FSO.FileExists(F)   Then FSO.CopyFile   F, Path
    If FSO.FolderExists(F) Then
      If Right(F, 1) = "\" Then F = Left(F, Len(F) - 1)
      FSO.CopyFolder F, Path
    End If
  End If
Next

Set FSO = Nothing
Wscript.Quit 0
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

А я батник написал, извратился. :)

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

@echo off

if -%1==- echo Use %%L as first parameter [and number of files in subdirs as second]! & pause & goto :EOF

setlocal

set fileno=0
set fldrsz=%2
if -%fldrsz%==- set fldrsz=50

for /F "usebackq delims=" %%f in (%1) do call :do_action "%%f"

echo.
echo Moved %fileno% files.
pause

goto :EOF


:do_action

set /a fldrno=1000000000 + fileno / fldrsz
set fldrnm=%fldrno:~-5%

echo Moving %1 to subfolder %fldrnm%...
if not exist %fldrnm% md %fldrnm%
move %1 %fldrnm%

set /a fileno=fileno + 1
Первый параметр - %L, второй - число файлов в создаваемых подпапках. Если не задано, используется 50. Папка запуска должна быть текущей (т.е. поле рабочей папки пусто).

При желании число нулей в именах папок можно изменить, увеличив или уменьшив цифру в строке set fldrnm=%fldrno:~-5% - но не следует делать ее больше, чем нулей в числе, указанном в строке set /a fldrno=1000000000 + fileno / fldrsz, а также не нужно делать ее меньше, чем хватит для имен папок - тогда имена папок будут повторяться из-за отбрасывания высших разрядов.

Но похоже, тут сложности с русскими буквами в именах.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Пока писал, уже два варианта появилось :D

Ну вот тогда третий до кучи, на Autoit.

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

; Параметры: "%P" "%T" 50

If $CmdLine[0] < 3 Then 
    MsgBox (0, "", "Недостаточно параметров, должно быть 3.")
    Exit
EndIf

Global $nDirCounter = 0
Global $nFileCounter = $CmdLine[3]

$hSearch = FileFindFirstFile($CmdLine[1] & "*.*")

While 1
    If $nFileCounter = $CmdLine[3] Then
        $nFileCounter = 0
        $nDirCounter += 1
        $sCurrentTarget = $CmdLine[2] & StringFormat("%03d", $nDirCounter)
        DirCreate($sCurrentTarget)
    EndIf
    $sFile = FileFindNextFile($hSearch)
    If @error Then Exit
    If @extended Then ContinueLoop ; без каталогов
    FileMove($CmdLine[1] & $sFile, $sCurrentTarget)
    $nFileCounter += 1
Wend
Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Сообщение Andrey_A »

Всем участникам темы огромное спасибо за скорость и за интересные идеи. Только что тестировал все три кода:
тестировал в папке с 9167 файлами с общим размером 273 мб. перемещал по 500 файлов

1. Bat произвёл операцию за 1 минуту 58 секунд (вопрос зачем выводить информацию на консоль, всё мелькает, всё и так понятно, но может это и отнимает время), с русским и пробелами справился с параметром %l
[-] для того, чтобы он работал его необходимо перемещать
2. Au3 сработал за 21 секунду, с русским языком и с пробелами справился
3. Vbs сработал за 23 секунды, с русским справился, с пробелами тоже (в нём я поменял Copy на Move - теперь он не копирует, а перемещает, параметры поменял на %L "%P" 50) [+] в нём есть параметр %L , что делает его более функциональным
Ещё раз всем спасибо, сэкономлено кучу времени!!!
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

[-] для того, чтобы он работал его необходимо перемещать
Интересно, кому я писал:
MVV писал(а):Папка запуска должна быть текущей (т.е. поле рабочей папки пусто).
Иначе, естественно, тотал установит текущей заданную папку, и файлы для перемещения будут искаться там, а не в той папке, в которой выделялись файлы. :D

А насчет вывода на консоль - убери строчку echo Moving %1 to subfolder %fldrnm%..., интересно, сколько получится времени...
Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Сообщение Andrey_A »

MVV я убрал строку, но продолжает писать "Перемещено файлов 1" и так до горизонта. Время действия осталось примерно таким же
kdn
Сообщения: 85
Зарегистрирован: Вт сен 19, 2006 06:40
Откуда: Москва, РФ

Сообщение kdn »

Ни один из вариантов не работает.Вариант от Batya - создается лишь папка каждый раз с именем 001 и туда помещаются все эти файлы, а батники - вообще не работают - черный экран мигнет и все.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

kdn писал(а):Вариант от Batya - создается лишь папка каждый раз с именем 001 и туда помещаются все эти файлы
Они копируются, а не перемещаются (из название скрипта видно). А если скопировалось только в одну папку, значит файлов не больше заданного кол-ва, либо просто не дождался, пока всё скопирует. Если автообновление не стоит, нужно обновить панель самостоятельно, тогда будут видны все записанные каталоги.
kdn писал(а):а батники - вообще не работают - черный экран мигнет и все.
Последний - не батник, а скрипт AutoIt. Все варианты - рабочие.
Ответить