View previous topic :: View next topic |
Author |
Message |
Andrey_A

Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Tue Sep 07, 2010 01:51 Post subject: Перемещение нужного количества файлов по папкам |
|
|
Всем форумчанам привет!
Задача такая: в папке есть кучу файлов. Необходимо переместить их в папки по 50 штук в каждую. Панель создания папок не важна - можно в эту же. Имена папок - тоже (001, 002....). Я пытался сам сделать батник или скрипт, но не получается. Желательно, чтобы в параметрах было 50 (т.е. число перемещаемых файлов можно было бы задать). |
|
Back to top |
|
 |
Tol!k

Joined: 01 Apr 2008 Posts: 1727 Location: Арзамас
|
(Separately) Posted: Tue Sep 07, 2010 04:09 Post subject: |
|
|
Если папки уже существуют, то... |
|
Back to top |
|
 |
Andrey_A

Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Tue Sep 07, 2010 08:14 Post subject: |
|
|
Tol!k это немного не то. Дополнительных Папок никаких нет, есть папка с файлами, имена у которых различны. Необходимо их распределить...
Можно их всех до батника выделить (параметры будут %l 50) |
|
Back to top |
|
 |
Вахмурка

Joined: 27 Dec 2004 Posts: 2581 Location: Большая деревня Москва
|
|
Back to top |
|
 |
Andrey_A

Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Tue Sep 07, 2010 09:17 Post subject: |
|
|
Вахмурка, и чем это поможет? Ты предлогаешь выделять вручную? В папке 56 тыс файлов... И таких не мало |
|
Back to top |
|
 |
Вахмурка

Joined: 27 Dec 2004 Posts: 2581 Location: Большая деревня Москва
|
(Separately) Posted: Tue Sep 07, 2010 09:48 Post subject: |
|
|
Чем богаты...
Просто не приходилось сталкиваться с такой проблемой.
Возможно, сама идея отправки сообщений окну Тотала может показаться продуктивной. Далее процесс можно автоматизировать: создал директорию - послал сообщение - выделил файлы - переместил - создал директорию... По крайней мере, иных идей автоматизации у меня нет. _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
 |
Samwatas
Joined: 12 Sep 2009 Posts: 95
|
(Separately) Posted: Tue Sep 07, 2010 09:48 Post subject: |
|
|
А нужно ВСЕ файлы в папке обрабатывать? |
|
Back to top |
|
 |
Batya

Joined: 15 Dec 2004 Posts: 2205 Location: Москва, Россия
|
(Separately) Posted: Tue Sep 07, 2010 09:52 Post subject: |
|
|
Andrey_A
vbs-скрипт:
Code: | '======================================================================
' Копирование выделенных файлов\папок по заданному количеству
' в отдельные (создаваемые) папки
' Параметры:
' {файл-список} {целевая папка} {количество}
' Пример параметров вызова из 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
|
_________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
 |
MVV

Joined: 15 Oct 2009 Posts: 4808 Location: Ростов-Дон
|
(Separately) Posted: Tue Sep 07, 2010 10:15 Post subject: |
|
|
А я батник написал, извратился.
Code: | @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, а также не нужно делать ее меньше, чем хватит для имен папок - тогда имена папок будут повторяться из-за отбрасывания высших разрядов.
Но похоже, тут сложности с русскими буквами в именах. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1197
|
(Separately) Posted: Tue Sep 07, 2010 10:29 Post subject: |
|
|
Пока писал, уже два варианта появилось
Ну вот тогда третий до кучи, на Autoit.
Code: |
; Параметры: "%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
|
|
|
Back to top |
|
 |
Andrey_A

Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Tue Sep 07, 2010 20:57 Post subject: |
|
|
Всем участникам темы огромное спасибо за скорость и за интересные идеи. Только что тестировал все три кода:
тестировал в папке с 9167 файлами с общим размером 273 мб. перемещал по 500 файлов
1. Bat произвёл операцию за 1 минуту 58 секунд (вопрос зачем выводить информацию на консоль, всё мелькает, всё и так понятно, но может это и отнимает время), с русским и пробелами справился с параметром %l
[-] для того, чтобы он работал его необходимо перемещать
2. Au3 сработал за 21 секунду, с русским языком и с пробелами справился
3. Vbs сработал за 23 секунды, с русским справился, с пробелами тоже (в нём я поменял Copy на Move - теперь он не копирует, а перемещает, параметры поменял на %L "%P" 50) [+] в нём есть параметр %L , что делает его более функциональным
Ещё раз всем спасибо, сэкономлено кучу времени!!! |
|
Back to top |
|
 |
MVV

Joined: 15 Oct 2009 Posts: 4808 Location: Ростов-Дон
|
(Separately) Posted: Tue Sep 07, 2010 23:14 Post subject: |
|
|
Quote: | [-] для того, чтобы он работал его необходимо перемещать |
Интересно, кому я писал:
MVV wrote: | Папка запуска должна быть текущей (т.е. поле рабочей папки пусто). |
Иначе, естественно, тотал установит текущей заданную папку, и файлы для перемещения будут искаться там, а не в той папке, в которой выделялись файлы.
А насчет вывода на консоль - убери строчку echo Moving %1 to subfolder %fldrnm%..., интересно, сколько получится времени... _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
 |
Andrey_A

Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Wed Sep 08, 2010 00:11 Post subject: |
|
|
MVV я убрал строку, но продолжает писать "Перемещено файлов 1" и так до горизонта. Время действия осталось примерно таким же |
|
Back to top |
|
 |
kdn
Joined: 19 Sep 2006 Posts: 85 Location: Москва, РФ
|
(Separately) Posted: Sun Oct 03, 2010 18:22 Post subject: |
|
|
Ни один из вариантов не работает.Вариант от Batya - создается лишь папка каждый раз с именем 001 и туда помещаются все эти файлы, а батники - вообще не работают - черный экран мигнет и все. |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Oct 03, 2010 18:58 Post subject: |
|
|
kdn wrote: | Вариант от Batya - создается лишь папка каждый раз с именем 001 и туда помещаются все эти файлы | Они копируются, а не перемещаются (из название скрипта видно). А если скопировалось только в одну папку, значит файлов не больше заданного кол-ва, либо просто не дождался, пока всё скопирует. Если автообновление не стоит, нужно обновить панель самостоятельно, тогда будут видны все записанные каталоги. kdn wrote: | а батники - вообще не работают - черный экран мигнет и все. | Последний - не батник, а скрипт AutoIt. Все варианты - рабочие. |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|