Перемещение нужного количества файлов по папкам
Модераторы: Моторокер, Avada, CaptainFlint, Nik, d-view
Перемещение нужного количества файлов по папкам
Всем форумчанам привет!
Задача такая: в папке есть кучу файлов. Необходимо переместить их в папки по 50 штук в каждую. Панель создания папок не важна - можно в эту же. Имена папок - тоже (001, 002....). Я пытался сам сделать батник или скрипт, но не получается. Желательно, чтобы в параметрах было 50 (т.е. число перемещаемых файлов можно было бы задать).
Задача такая: в папке есть кучу файлов. Необходимо переместить их в папки по 50 штук в каждую. Панель создания папок не важна - можно в эту же. Имена папок - тоже (001, 002....). Я пытался сам сделать батник или скрипт, но не получается. Желательно, чтобы в параметрах было 50 (т.е. число перемещаемых файлов можно было бы задать).
Если папки уже существуют, то...
- Вахмурка
- Сообщения: 2587
- Зарегистрирован: Пн дек 27, 2004 14:47
- Откуда: Большая деревня Москва
- Контактная информация:
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
- Вахмурка
- Сообщения: 2587
- Зарегистрирован: Пн дек 27, 2004 14:47
- Откуда: Большая деревня Москва
- Контактная информация:
Чем богаты...
Просто не приходилось сталкиваться с такой проблемой.
Возможно, сама идея отправки сообщений окну Тотала может показаться продуктивной. Далее процесс можно автоматизировать: создал директорию - послал сообщение - выделил файлы - переместил - создал директорию... По крайней мере, иных идей автоматизации у меня нет.
Просто не приходилось сталкиваться с такой проблемой.
Возможно, сама идея отправки сообщений окну Тотала может показаться продуктивной. Далее процесс можно автоматизировать: создал директорию - послал сообщение - выделил файлы - переместил - создал директорию... По крайней мере, иных идей автоматизации у меня нет.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Andrey_A
vbs-скрипт:
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
Нет, я не сплю. Я просто медленно моргаю.
А я батник написал, извратился. 
Первый параметр - %L, второй - число файлов в создаваемых подпапках. Если не задано, используется 50. Папка запуска должна быть текущей (т.е. поле рабочей папки пусто).
При желании число нулей в именах папок можно изменить, увеличив или уменьшив цифру в строке set fldrnm=%fldrno:~-5% - но не следует делать ее больше, чем нулей в числе, указанном в строке set /a fldrno=1000000000 + fileno / fldrsz, а также не нужно делать ее меньше, чем хватит для имен папок - тогда имена папок будут повторяться из-за отбрасывания высших разрядов.
Но похоже, тут сложности с русскими буквами в именах.
Код: Выделить всё
@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
При желании число нулей в именах папок можно изменить, увеличив или уменьшив цифру в строке set fldrnm=%fldrno:~-5% - но не следует делать ее больше, чем нулей в числе, указанном в строке set /a fldrno=1000000000 + fileno / fldrsz, а также не нужно делать ее меньше, чем хватит для имен папок - тогда имена папок будут повторяться из-за отбрасывания высших разрядов.
Но похоже, тут сложности с русскими буквами в именах.
Пока писал, уже два варианта появилось
Ну вот тогда третий до кучи, на Autoit.
Ну вот тогда третий до кучи, на 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
Всем участникам темы огромное спасибо за скорость и за интересные идеи. Только что тестировал все три кода:
тестировал в папке с 9167 файлами с общим размером 273 мб. перемещал по 500 файлов
1. Bat произвёл операцию за 1 минуту 58 секунд (вопрос зачем выводить информацию на консоль, всё мелькает, всё и так понятно, но может это и отнимает время), с русским и пробелами справился с параметром %l
[-] для того, чтобы он работал его необходимо перемещать
2. Au3 сработал за 21 секунду, с русским языком и с пробелами справился
3. Vbs сработал за 23 секунды, с русским справился, с пробелами тоже (в нём я поменял Copy на Move - теперь он не копирует, а перемещает, параметры поменял на %L "%P" 50) [+] в нём есть параметр %L , что делает его более функциональным
Ещё раз всем спасибо, сэкономлено кучу времени!!!
тестировал в папке с 9167 файлами с общим размером 273 мб. перемещал по 500 файлов
1. Bat произвёл операцию за 1 минуту 58 секунд (вопрос зачем выводить информацию на консоль, всё мелькает, всё и так понятно, но может это и отнимает время), с русским и пробелами справился с параметром %l
[-] для того, чтобы он работал его необходимо перемещать
2. Au3 сработал за 21 секунду, с русским языком и с пробелами справился
3. Vbs сработал за 23 секунды, с русским справился, с пробелами тоже (в нём я поменял Copy на Move - теперь он не копирует, а перемещает, параметры поменял на %L "%P" 50) [+] в нём есть параметр %L , что делает его более функциональным
Ещё раз всем спасибо, сэкономлено кучу времени!!!
Интересно, кому я писал:[-] для того, чтобы он работал его необходимо перемещать
Иначе, естественно, тотал установит текущей заданную папку, и файлы для перемещения будут искаться там, а не в той папке, в которой выделялись файлы.MVV писал(а):Папка запуска должна быть текущей (т.е. поле рабочей папки пусто).
А насчет вывода на консоль - убери строчку echo Moving %1 to subfolder %fldrnm%..., интересно, сколько получится времени...
Они копируются, а не перемещаются (из название скрипта видно). А если скопировалось только в одну папку, значит файлов не больше заданного кол-ва, либо просто не дождался, пока всё скопирует. Если автообновление не стоит, нужно обновить панель самостоятельно, тогда будут видны все записанные каталоги.kdn писал(а):Вариант от Batya - создается лишь папка каждый раз с именем 001 и туда помещаются все эти файлы
Последний - не батник, а скрипт AutoIt. Все варианты - рабочие.kdn писал(а):а батники - вообще не работают - черный экран мигнет и все.