Страница 1 из 9
Перемещение нужного количества файлов по папкам
Добавлено: Вт сен 07, 2010 01:51
Andrey_A
Всем форумчанам привет!
Задача такая: в папке есть кучу файлов. Необходимо переместить их в папки по 50 штук в каждую. Панель создания папок не важна - можно в эту же. Имена папок - тоже (001, 002....). Я пытался сам сделать батник или скрипт, но не получается. Желательно, чтобы в параметрах было 50 (т.е. число перемещаемых файлов можно было бы задать).
Добавлено: Вт сен 07, 2010 04:09
Tol!k
Если папки уже существуют,
то...
Добавлено: Вт сен 07, 2010 08:14
Andrey_A
Tol!k это немного не то. Дополнительных Папок никаких нет, есть папка с файлами, имена у которых различны. Необходимо их распределить...
Можно их всех до батника выделить (параметры будут %l 50)
Добавлено: Вт сен 07, 2010 09:04
Вахмурка
Добавлено: Вт сен 07, 2010 09:17
Andrey_A
Вахмурка, и чем это поможет? Ты предлогаешь выделять вручную? В папке 56 тыс файлов... И таких не мало
Добавлено: Вт сен 07, 2010 09:48
Вахмурка
Чем богаты...
Просто не приходилось сталкиваться с такой проблемой.
Возможно, сама идея отправки сообщений окну Тотала может показаться продуктивной. Далее процесс можно автоматизировать: создал директорию - послал сообщение - выделил файлы - переместил - создал директорию... По крайней мере, иных идей автоматизации у меня нет.
Добавлено: Вт сен 07, 2010 09:48
Samwatas
А нужно ВСЕ файлы в папке обрабатывать?
Добавлено: Вт сен 07, 2010 09:52
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
Добавлено: Вт сен 07, 2010 10:15
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, а также не нужно делать ее меньше, чем хватит для имен папок - тогда имена папок будут повторяться из-за отбрасывания высших разрядов.
Но похоже, тут сложности с русскими буквами в именах.
Добавлено: Вт сен 07, 2010 10:29
Loopback
Пока писал, уже два варианта появилось
Ну вот тогда третий до кучи, на 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
Добавлено: Вт сен 07, 2010 20:57
Andrey_A
Всем участникам темы огромное спасибо за скорость и за интересные идеи. Только что тестировал все три кода:
тестировал в папке с 9167 файлами с общим размером 273 мб. перемещал по 500 файлов
1. Bat произвёл операцию за 1 минуту 58 секунд (вопрос зачем выводить информацию на консоль, всё мелькает, всё и так понятно, но может это и отнимает время), с русским и пробелами справился с параметром %l
[-] для того, чтобы он работал его необходимо перемещать
2. Au3 сработал за 21 секунду, с русским языком и с пробелами справился
3. Vbs сработал за 23 секунды, с русским справился, с пробелами тоже (в нём я поменял Copy на Move - теперь он не копирует, а перемещает, параметры поменял на %L "%P" 50) [+] в нём есть параметр %L , что делает его более функциональным
Ещё раз всем спасибо, сэкономлено кучу времени!!!
Добавлено: Вт сен 07, 2010 23:14
MVV
[-] для того, чтобы он работал его необходимо перемещать
Интересно, кому я писал:
MVV писал(а):Папка запуска должна быть текущей (т.е. поле рабочей папки пусто).
Иначе, естественно, тотал установит текущей заданную папку, и файлы для перемещения будут искаться там, а не в той папке, в которой выделялись файлы.
А насчет вывода на консоль - убери строчку
echo Moving %1 to subfolder %fldrnm%..., интересно, сколько получится времени...
Добавлено: Ср сен 08, 2010 00:11
Andrey_A
MVV я убрал строку, но продолжает писать "Перемещено файлов 1" и так до горизонта. Время действия осталось примерно таким же
Добавлено: Вс окт 03, 2010 18:22
kdn
Ни один из вариантов не работает.Вариант от Batya - создается лишь папка каждый раз с именем 001 и туда помещаются все эти файлы, а батники - вообще не работают - черный экран мигнет и все.
Добавлено: Вс окт 03, 2010 18:58
Flasher
kdn писал(а):Вариант от Batya - создается лишь папка каждый раз с именем 001 и туда помещаются все эти файлы
Они копируются, а не перемещаются (из название скрипта видно). А если скопировалось только в одну папку, значит файлов не больше заданного кол-ва, либо просто не дождался, пока всё скопирует. Если автообновление не стоит, нужно обновить панель самостоятельно, тогда будут видны все записанные каталоги.
kdn писал(а):а батники - вообще не работают - черный экран мигнет и все.
Последний - не батник, а скрипт AutoIt. Все варианты - рабочие.