Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Перенесение файлов в папки по алфавиту

 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
JKT



Joined: 22 Sep 2009
Posts: 116
Location: Харьков

Post (Separately) Posted: Sun May 13, 2012 09:09    Post subject: Перенесение файлов в папки по алфавиту Reply with quote

Здравствуйте!
Есть постоянно пополняемая папка.
Есть вторая, где подпапки типа "0-9-A-Z" и далее по алфавиту, папки "А", "Б", "В"......."Я".
Так вот, файлы, начинающиеся (первый символ в имени) на цифру или на англ букву кидаются в папку "0-9-A-Z", а все остальные (первый символ кирилица) сортируются по своим "А", "Б", "В"......

А вопрос такой.
В одной панели выделить что хотим переместить (по соответствующим папкам), в другой панели та "Вторая" с подпапками , подпапки чисто буквы алфавита, и раскидать их.
Как-бы сие соорудить?
Вот как мог нарисовал:
http://i37.fastpic.ru/big/2012/0513/fa/bf9fdb8c1e226e26f6a03ccf65189ffa.jpg
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6193
Location: Москва

Post (Separately) Posted: Sun May 13, 2012 12:11    Post subject: Reply with quote

JKT
После появления в Тотале нормальной поддержки перемещения через Инструмент группового переименования это легко делается через него. В качестве маски имени указать c:\target\path\[N1]\[N], а в поиске-замене какую-нибудь регулярку типа \\[0-9a-z]\\ на \\0-9-A-Z\\ (это если в целевом пути нет однобуквенных папок; если есть, выражение придётся усложнить).

Добавлено:
Ошибся; оказывается, полный путь так указывать нельзя…
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?


Last edited by CaptainFlint on Tue May 29, 2012 00:57; edited 1 time in total
Back to top
View user's profile Send private message
JKT



Joined: 22 Sep 2009
Posts: 116
Location: Харьков

Post (Separately) Posted: Sun May 13, 2012 13:15    Post subject: Reply with quote

CaptainFlint
Гм... Даже не знал, что можно перемещать файлы изменяя пути (имена) в групповом переименовании. Попробую. Спасибо.
Back to top
View user's profile Send private message
savigrand



Joined: 24 Jun 2010
Posts: 20

Post (Separately) Posted: Sun May 27, 2012 18:37    Post subject: Reply with quote

CaptainFlint wrote:
JKT
После появления в Тотале нормальной поддержки перемещения через Инструмент группового переименования это легко делается через него. В качестве маски имени указать c:\target\path\[N1]\[N], а в поиске-замене какую-нибудь регулярку типа \\[0-9a-z]\\ на \\0-9-A-Z\\ (это если в целевом пути нет однобуквенных папок; если есть, выражение придётся усложнить).

Не удается так сделать. Когда пишу в качестве маски имени путь с указанием диска (C:\target ...) то сразу же в конечных именах файлов возникает ошибка. Если же писать путь относительно текущего каталога (target\path если мы находимся в каталоге диска С) то нормально все перемещает без проблем. Как быть с указанием полного пути с указанием диска?
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sun May 27, 2012 21:44    Post subject: Reply with quote

savigrand
Никак. Это не работает. Плагина, возвращающего путь другой панели я не знаю (и скорее его пока нет). Выражение [T] аля [P] или [G] Гислер не предусмотрел. И задача-то какая? Если просто раскидать по папкам с односимвольными именами, то это уже в трёх темах тут обсуждалось.
Back to top
View user's profile Send private message
savigrand



Joined: 24 Jun 2010
Posts: 20

Post (Separately) Posted: Mon May 28, 2012 00:48    Post subject: Reply with quote

Flasher wrote:
savigrand
Никак. Это не работает. Плагина, возвращающего путь другой панели я не знаю (и скорее его пока нет). Выражение [T] аля [P] или [G] Гислер не предусмотрел. И задача-то какая? Если просто раскидать по папкам с односимвольными именами, то это уже в трёх темах тут обсуждалось.

Да плагин мне не нужен, путь я могу и руками вбить.
Что касается задачи - то да, раскидать файлы по каталогам. Все темы, где это обсуждалось с помощью скриптов - видел. Но хотелось бы узнать про реализацию с помощью группового переименования, т.к. этот инструмент более гибок в плане применения регулярных выражения на лету (если с помощью скрипта, то надо править сам скрипт, если условия задачи изменились).
Пока что решение такое: раскидываю файлы в текущем каталоге по папкам, а далее уже эти папки перемещаю куда нужно. К сожалению одним действием не получается.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Mon May 28, 2012 14:27    Post subject: Reply with quote

savigrand wrote:
Да плагин мне не нужен, путь я могу и руками вбить.
По-моему, должно быть понятно, что без плагина работать не будет. Советую проверить подстановку данных.
savigrand wrote:
если с помощью скрипта, то надо править сам скрипт, если условия задачи изменились
Скрипт всегда можно изменить под указание условий в параметрах. Это тоже по логике должно быть понятно.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2692

Post (Separately) Posted: Mon May 28, 2012 16:35    Post subject: Reply with quote

savigrand
Если всё же диск один и тот же, то можно попробовать такую маску:
\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\target\path\[N1]\[N]
Back to top
View user's profile Send private message
savigrand



Joined: 24 Jun 2010
Posts: 20

Post (Separately) Posted: Wed Jun 06, 2012 23:41    Post subject: Reply with quote

sa wrote:
savigrand
Если всё же диск один и тот же, то можно попробовать такую маску:
\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\target\path\[N1]\[N]

Да, так получается, но к сожалению на одном и том же диске, но уже что-то, спасибо за помощь Smile
Flasher wrote:
По-моему, должно быть понятно, что без плагина работать не будет. Советую проверить подстановку данных.

Плагин не нужен! Мне нужно указать путь для конечных файлов тот, которыя я хочу!
Flasher wrote:
Скрипт всегда можно изменить под указание условий в параметрах. Это тоже по логике должно быть понятно.

Это то и понятно, но следуя такой логике - можно и Total Commander под себя написать с нуля.
Чтобы поменять в скрипте, нужно открывать его, разбираться в коде. А в случае с групповым переименованием - меняется только маска для имени файла. Этот способ изящнее и удобнее в использовании. Хотя скрипт предоставляет более мощные инструменты, но для простых задач он не совсем удобен.
Вопрос не в том, как решить задачу, а как усовершенствовать её решение.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Jun 07, 2012 11:04    Post subject: Reply with quote

savigrand wrote:
Плагин не нужен! Мне нужно указать путь для конечных файлов тот, которыя я хочу!
А зачем, если есть другая панель, где этот путь уже есть? Этот путь не из головы берётся. Ведь так? Каждый раз его копировать, вызывать ИГП, выделять нужную часть и прописывать? Долго и неудобно.

savigrand wrote:
следуя такой логике - можно и Total Commander под себя написать с нуля.
По сопоставимости временных рамок? Глупость глупейшая.

savigrand wrote:
Чтобы поменять в скрипте, нужно открывать его, разбираться в коде.
Да, открыть это ооочень долго...
Разбираться в коде, как показывает нынешняя практика, можно не обязательно вопрошаещему.
savigrand wrote:
А в случае с групповым переименованием - меняется только маска для имени файла. Этот способ изящнее и удобнее в использовании.
Я выше написал, почему это неудобно.

savigrand wrote:
Вопрос не в том, как решить задачу, а как усовершенсвовать её решение.
Какое решение? То, что sa предложил? Без Гислера не получится...
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2224
Location: Москва, Россия

Post (Separately) Posted: Thu Jun 07, 2012 12:33    Post subject: Reply with quote

savigrand wrote:
Но хотелось бы узнать про реализацию с помощью группового переименования, т.к. этот инструмент более гибок в плане применения регулярных выражения на лету (если с помощью скрипта, то надо править сам скрипт, если условия задачи изменились).

В следующем vbs-скрипте используются регулярные выражения для задания соответствия - см. шапку скрипта в части "Изменяемые параметры":
Code:
'=====================================================================
' Перемещение выделенных файлов\папок в соответствующие им папки на
'   противоположной панели 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

_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
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