Страница 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