Страница 1 из 1
Перенесение файлов в папки по алфавиту
Добавлено: Вс май 13, 2012 09:09
JKT
Здравствуйте!
Есть постоянно пополняемая папка.
Есть вторая, где подпапки типа "0-9-A-Z" и далее по алфавиту, папки "А", "Б", "В"......."Я".
Так вот, файлы, начинающиеся (первый символ в имени) на цифру или на англ букву кидаются в папку "0-9-A-Z", а все остальные (первый символ кирилица) сортируются по своим "А", "Б", "В"......
А вопрос такой.
В одной панели выделить что хотим переместить (по соответствующим папкам), в другой панели та "Вторая" с подпапками , подпапки чисто буквы алфавита, и раскидать их.
Как-бы сие соорудить?
Вот как мог нарисовал:
http://i37.fastpic.ru/big/2012/0513/fa/ ... 189ffa.jpg
Добавлено: Вс май 13, 2012 12:11
CaptainFlint
JKT
После появления в Тотале нормальной поддержки перемещения через Инструмент группового переименования это легко делается через него. В качестве маски имени указать c:\target\path\[N1]\[N], а в поиске-замене какую-нибудь регулярку типа \\[0-9a-z]\\ на \\0-9-A-Z\\ (это если в целевом пути нет однобуквенных папок; если есть, выражение придётся усложнить).
Добавлено:
Ошибся; оказывается, полный путь так указывать нельзя…
Добавлено: Вс май 13, 2012 13:15
JKT
CaptainFlint
Гм... Даже не знал, что можно перемещать файлы изменяя пути (имена) в групповом переименовании. Попробую. Спасибо.
Добавлено: Вс май 27, 2012 18:37
savigrand
CaptainFlint писал(а):JKT
После появления в Тотале нормальной поддержки перемещения через Инструмент группового переименования это легко делается через него. В качестве маски имени указать c:\target\path\[N1]\[N], а в поиске-замене какую-нибудь регулярку типа \\[0-9a-z]\\ на \\0-9-A-Z\\ (это если в целевом пути нет однобуквенных папок; если есть, выражение придётся усложнить).
Не удается так сделать. Когда пишу в качестве маски имени путь с указанием диска (C:\target ...) то сразу же в конечных именах файлов возникает ошибка. Если же писать путь относительно текущего каталога (target\path если мы находимся в каталоге диска С) то нормально все перемещает без проблем. Как быть с указанием полного пути с указанием диска?
Добавлено: Вс май 27, 2012 21:44
Flasher
savigrand
Никак. Это не работает. Плагина, возвращающего путь другой панели я не знаю (и скорее его пока нет). Выражение [T] аля [P] или [G] Гислер не предусмотрел. И задача-то какая? Если просто раскидать по папкам с односимвольными именами, то это уже в трёх темах тут обсуждалось.
Добавлено: Пн май 28, 2012 00:48
savigrand
Flasher писал(а):savigrand
Никак. Это не работает. Плагина, возвращающего путь другой панели я не знаю (и скорее его пока нет). Выражение [T] аля [P] или [G] Гислер не предусмотрел. И задача-то какая? Если просто раскидать по папкам с односимвольными именами, то это уже в трёх темах тут обсуждалось.
Да плагин мне не нужен, путь я могу и руками вбить.
Что касается задачи - то да, раскидать файлы по каталогам. Все темы, где это обсуждалось с помощью скриптов - видел. Но хотелось бы узнать про реализацию с помощью группового переименования, т.к. этот инструмент более гибок в плане применения регулярных выражения на лету (если с помощью скрипта, то надо править сам скрипт, если условия задачи изменились).
Пока что решение такое: раскидываю файлы в текущем каталоге по папкам, а далее уже эти папки перемещаю куда нужно. К сожалению одним действием не получается.
Добавлено: Пн май 28, 2012 14:27
Flasher
savigrand писал(а):Да плагин мне не нужен, путь я могу и руками вбить.
По-моему, должно быть понятно, что без плагина работать не будет. Советую проверить подстановку данных.
savigrand писал(а):если с помощью скрипта, то надо править сам скрипт, если условия задачи изменились
Скрипт всегда можно изменить под указание условий в параметрах. Это тоже по логике должно быть понятно.
Добавлено: Пн май 28, 2012 16:35
sa
savigrand
Если всё же диск один и тот же, то можно попробовать такую маску:
\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\target\path\[N1]\[N]
Добавлено: Ср июн 06, 2012 23:41
savigrand
sa писал(а):savigrand
Если всё же диск один и тот же, то можно попробовать такую маску:
\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\target\path\[N1]\[N]
Да, так получается, но к сожалению на одном и том же диске, но уже что-то, спасибо за помощь
Flasher писал(а):По-моему, должно быть понятно, что без плагина работать не будет. Советую проверить подстановку данных.
Плагин не нужен! Мне нужно указать путь для конечных файлов тот, которыя я хочу!
Flasher писал(а):Скрипт всегда можно изменить под указание условий в параметрах. Это тоже по логике должно быть понятно.
Это то и понятно, но следуя такой логике - можно и Total Commander под себя написать с нуля.
Чтобы поменять в скрипте, нужно открывать его, разбираться в коде. А в случае с групповым переименованием - меняется только маска для имени файла. Этот способ изящнее и удобнее в использовании. Хотя скрипт предоставляет более мощные инструменты, но для простых задач он не совсем удобен.
Вопрос не в том, как решить задачу, а как усовершенствовать её решение.
Добавлено: Чт июн 07, 2012 11:04
Flasher
savigrand писал(а):Плагин не нужен! Мне нужно указать путь для конечных файлов тот, которыя я хочу!
А зачем, если есть другая панель, где этот путь уже есть? Этот путь не из головы берётся. Ведь так? Каждый раз его копировать, вызывать ИГП, выделять нужную часть и прописывать? Долго и неудобно.
savigrand писал(а):следуя такой логике - можно и Total Commander под себя написать с нуля.
По сопоставимости временных рамок? Глупость глупейшая.
savigrand писал(а):Чтобы поменять в скрипте, нужно открывать его, разбираться в коде.
Да, открыть это ооочень долго...
Разбираться в коде, как показывает нынешняя практика, можно не обязательно вопрошаещему.
savigrand писал(а):А в случае с групповым переименованием - меняется только маска для имени файла. Этот способ изящнее и удобнее в использовании.
Я выше написал, почему это неудобно.
savigrand писал(а):Вопрос не в том, как решить задачу, а как усовершенсвовать её решение.
Какое решение? То, что
sa предложил? Без Гислера не получится...
Добавлено: Чт июн 07, 2012 12:33
Batya
savigrand писал(а):Но хотелось бы узнать про реализацию с помощью группового переименования, т.к. этот инструмент более гибок в плане применения регулярных выражения на лету (если с помощью скрипта, то надо править сам скрипт, если условия задачи изменились).
В следующем vbs-скрипте используются регулярные выражения для задания соответствия - см. шапку скрипта в части "Изменяемые параметры":
Код: Выделить всё
'=====================================================================
' Перемещение выделенных файлов\папок в соответствующие им папки на
' противоположной панели TC
' Параметры вызова из TC:
' %L "%T"
'=====================================================================
Option Explicit
Dim EF
Set EF = CreateObject("Scripting.Dictionary")
'========== Изменяемые параметры =====================================
'Массив соответствия, задаваемый регулярными выражениями
EF.Add "^[\dA-Za-z].*$", "0-9-A-Z"
EF.Add "^([А-Яа-я]).*$", "$1"
'=====================================================================
Dim Title, Mess, FSO, ListF, List, Target, Fold, File, NewPath, REx, K, M, i
' Проверяем параметры
Title = "Внимание!"
If WScript.Arguments.Count < 2 Then
Mess = "Неправильно указаны параметры!"
MessQuit
End If
Set FSO = CreateObject("Scripting.FileSystemObject")
ListF = WScript.Arguments(0)
Target = WScript.Arguments(1)
If Right(Target, 1) <> "" Then Target = Target & ""
If Not FSO.FileExists(ListF) Then
Mess = "Неправильно указан файл-список обрабатываемых файлов!"
MessQuit
End If
If Not FSO.FolderExists(Target) Then
Mess = "Неправильно указана целевая папка!"
MessQuit
End If
Set REx = New RegExp
List = Split(FSO.OpenTextFile(ListF).ReadAll, vbNewLine)
For Each File In List
Fold = ""
If File <> "" Then
For Each K In EF.Keys
REx.Pattern = K
If REx.Test(FSO.GetFileName(File)) Then
Fold = REx.Replace(FSO.GetFileName(File), EF(K))
Exit For
End If
Next
If Fold <> "" Then
Fold = Target & Fold & ""
If FSO.FolderExists(Fold) Then
NewPath = NextName(Fold & FSO.GetFileName(File))
If FSO.FileExists (File) Then FSO.MoveFile File, NewPath
If FSO.FolderExists(File) Then
If Right(File, 1) = "" Then File = Mid(File, 1, Len(File) - 1)
FSO.MoveFolder File, NewPath
End If
End If
End If
End If
Next
MsgBox "Выполнено!", vbOKOnly + vbInformation, "Результат"
Quit
Function NextName(pPath)
Dim lPath, lName, lExt, li, lAdd
Const lQ = 1 'Минимальное количество цифр в номере
With CreateObject("Scripting.FileSystemObject")
lPath = .GetParentFolderName(pPath)
If lPath <> "" Then lPath = lPath & ""
lName = .GetBaseName(pPath)
lExt = .GetExtensionName(pPath)
NextName = pPath
Do While .FileExists(NextName) Or .FolderExists(NextName)
li = li + 1
If li < 10^lQ Then
lAdd = Right(String(lQ, "0") & li, lQ)
Else
lAdd = li
End If
NextName = lPath & lName & "_" & lAdd & "." & lExt
Loop
End With
End Function
Sub MessQuit
MsgBox Mess, vbOKOnly + vbError, Title
Quit
End Sub
Sub Quit
Set FSO = Nothing
Wscript.Quit
End Sub