Переместить файлы по маске в папки, соответствующие маскам
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Автоматизация Total Commander

#1: Переместить файлы по маске в папки, соответствующие маскам Author: Hjkma PostPosted: Tue Jul 26, 2016 14:20
    —
Здравствуйте.
Ищу способ, который позволил бы перемещать файлы по маске в специальные новосозданные папки. Причем так чтобы перемещались по масково по отдельности в папки, т.е. файлы, соответствующие одной маской, отправляются в одну папку, а файлы соответствующие другой маске, отправляются в другую папку и т.д.
Дело в том, что у меня в одной папке есть около 500+ тыс. файлов, собранные со всех каталогов по поиску по маскам. И мне потребуется отсортировать огромную кучу файлов так, чтобы они переместились в соответствующие их маскам каталоги, причем названия каталогов должны браться из масок имени файлов. Например, есть у меня маска "melissa clarke", по ней находятся где-то три тысячи файлов и они должны переместиться в папку под названием "melissa clarke". А есть другая маска "*.gif", которая находит в этом каталоге 6 тыс. гифок и они должны переместиться в папку под названием "*.gif". Надеюсь принцип понятен. Как это сделать, самостоятельно в интернете не нашел, так что обращаюсь к вам с помощью, возможно есть способ создать такой скрипт, который позволил бы это реализовать.
Если это получится, то по идее в таком огромном каталоге должно создаться 2000+ подпапок, которые по отдельности будут представлять с себя хранилища файлов, соответствующие одной из масок, так как сами маски суммарно представляют собой 2+ тыс. отдельных единиц. И кстати в целом сам перечень масок занимает собой 24 тыс. знаков, так что хотелось бы чтобы сами маски можно было бы внести в код скрипта, т.к. лимит параметров в настройке инструментов ограничен 2048 знаков. А еще возможна такая ситуация, когда будут такие файлы, названия которых будут соответствовать нескольким маскам из целого перечня масок. В таком случае, пусть такие файлы перемещаются по принципу первенства масок, т.е. перемещаются в папки только по маске, которая в перечне масок стоит наиболее первой. Как-то так. Надеюсь на помощь и заранее спасибо!

#2:  Author: FlasherLocation: Москва PostPosted: Tue Jul 26, 2016 15:18
    —
Hjkma
Тем с перемещением у нас было жуть как много (в частности). Можно было и не создавать новую.

Имена, на секундочку, не могут содержать *, поэтому именовать таким образом не получится. Нужно искать альтернативный символ. А так ничего сложного, всё тот же принцип, только ещё проще.

Впрочем, я уже нашёл (*﹡⋇⋆×∗⋆). Какой берём?

#3:  Author: Hjkma PostPosted: Tue Jul 26, 2016 15:40
    —
Flasher
Простите, что не создал в этой теме пост. Можно перенести и эту тему удалить. Просто искал по форуме тему как перенести файлы в специальные папки по масково и ничего не нашел, так что решил создать новую.

Насчет символа, предоставляю на ваш выбор. Только про имена я не понял, речь о названиях новых папок? Если так, лучше использовать такой символ, чтобы со всех устройств можно было бы заходить в такие папки.

#4:  Author: FlasherLocation: Москва PostPosted: Tue Jul 26, 2016 15:51
    —
Hjkma
Уже неважно. Пусть тут будет.

И что, мне предлагается все возможные устройства проверить? Very Happy

#5:  Author: Hjkma PostPosted: Tue Jul 26, 2016 15:52
    —
Flasher
Ну ладно, пусть будет любой символ. Если что, я всегда могу просто путем массового переименования убрать символ с названий папок.

#6:  Author: FlasherLocation: Москва PostPosted: Tue Jul 26, 2016 16:16
    —
Hjkma
Перечитал первый пост и не совсем понял.
В этой одной папке подпапок вообще нет? Т.е. все 500 тыс. файлов скинуты в неё? А смысл? Это создаёт плохие условия для работы файлменеджеров.
Можно было бы и так искать.
Т.е. надо полагать, что и повторных имён нет?

#7:  Author: Hjkma PostPosted: Tue Jul 26, 2016 16:20
    —
Flasher
Конкретно в этой папке подпапок нет. Дело в том, что файлы в этой папке изначательно были из других каталогов и перемещены потом в это место после поиска по маскам по всему компьютеру. Про повторных имён я не понял? Речь об имён файлов? Если да, то нет, названия файлов не идентичны и не повторяются.

#8:  Author: FlasherLocation: Москва PostPosted: Tue Jul 26, 2016 16:22
    —
Hjkma
А папки там же создавать?


Last edited by Flasher on Tue Jul 26, 2016 16:29; edited 2 times in total

#9:  Author: Hjkma PostPosted: Tue Jul 26, 2016 16:26
    —
Flasher
Папку? Или папкИ? Если да, то там же конечно. Еще один момент, Тотал очень долго эту папку открывает, так что хотелось бы чтобы скрипт работал бы с папкой под курсором (чтобы не открывать её)? Это возможно?

#10:  Author: FlasherLocation: Москва PostPosted: Tue Jul 26, 2016 16:30
    —
Hjkma
Исправил. Мин.

Add: Немного потестировать пришлось.
Code:
'=================== VBS ===================
' Переместить файлы из каталога под курсором
' в папки с именами соответствующих им масок
' Параметр: %V
'===========================================
Option Explicit: Dim Filt, Fold, FSO, ShAp, Items, Mask, Name, Path
'===================== Маски файлов через "|" =====================
Filt = "1*.*|*name*|name*.txt|name 1.txt|name 1*.txt|name *1.*|" &_
"*2*|2.txt|name2.txt|name 2.txt|name *2.txt|name 2*.*|name 2.*|" &_
"*3*.txt|name 3.*|name3.txt|name 4.txt|name *4*.txt|*5*|*5*.txt"
'==================================================================
Fold = WScript.Arguments(0)
Set FSO  = CreateObject("Scripting.FileSystemObject")
If Not FSO.FolderExists(Fold) Then WScript.Quit
Set ShAp = CreateObject("Shell.Application")
Set Fold = ShAp.NameSpace(Fold)
Set Items = Fold.Items
For Each Mask in Split(Filt, "|")
  Items.Filter 73920, Mask
  If Items.Count Then
    Name = Replace(Mask, "*", ChrW(-246))
    Path = Fold.Self.Path & "\" & Name
    If Not FSO.FolderExists(Path) Then Fold.NewFolder(Name)
    ShAp.NameSpace(Path).MoveHere Items
  End If
Next

#11:  Author: Hjkma PostPosted: Tue Jul 26, 2016 17:09
    —
Flasher
Отлично, все работает как надо! Огромное вам спасибо, ваши скрипты очень меня выручают!

#12:  Author: Lex177 PostPosted: Tue Dec 06, 2016 13:07
    —
Здравствуйте!

Подскажите пожалуйста как правильно прописать маску для файлов:
05534_151_1_1.jpg
05535_160_1_1.jpg
05535_160_1_2.jpg
05536_162_2_1.jpg
05536_162_2_2.jpg
05536_162_2_3.jpg

Нужно, чтобы все файлы с одинаковым значением до первого подчеркивания попадали в одну папку с одноименным названием (05534, 05535, 05536).

#13:  Author: StaniclawLocation: Ташкент PostPosted: Tue Dec 06, 2016 13:18
    —
Lex177
ИГП, регулярное выражение.
Если там только цифры и подчёркивания, то навскидку так:
Поиск: ^(\d+?)_
Замена: $1\$1_

#14:  Author: Lex177 PostPosted: Tue Dec 06, 2016 13:44
    —
Да, все фото одного вида.
Не понял что куда вставлять.

Добавлено спустя 3 минуты:

Может быть проще написать, чтобы первые 5 символов были маской и они же названием новой папки?
Только я не знаю как это прописать....

#15:  Author: StaniclawLocation: Ташкент PostPosted: Tue Dec 06, 2016 13:51
    —
Lex177 wrote:
Не понял что куда вставлять.
В окно инструмента группового переименования, который про умолчанию вызывается клавишами Ctrl+M. Там сверху справа есть поля для поиска и замены. Вставьте маски туда и отметьте галочку ''Рег. выраж.''.

#16:  Author: Lex177 PostPosted: Tue Dec 06, 2016 14:07
    —
Staniclaw, спасибо за ответ. Но мне необходимо чтобы фото перемещались в свои папки с созданием оных. Стандартный инструмент этого не умеет, на сколько я знаю.

#17:  Author: sa PostPosted: Tue Dec 06, 2016 14:13
    —
Lex177 wrote:
Стандартный инструмент этого не умеет

Попробовать-то можно, вдруг умеет.

#18:  Author: Lex177 PostPosted: Tue Dec 06, 2016 15:06
    —
ПопробовалWink не умеет.
Не просто так пишутся плагины на подобие этого (из этой ветки).

#19:  Author: sa PostPosted: Tue Dec 06, 2016 15:14
    —
Lex177
А так?
Замена: $1\\$1_

#20:  Author: Lex177 PostPosted: Tue Dec 06, 2016 15:55
    —
Решил!
Все оказалось не так уж сложно.
В маску для имени файла прописал \[N1-5]\[N]
Всем спасибо за участие!

#21:  Author: StaniclawLocation: Ташкент PostPosted: Tue Dec 06, 2016 16:00
    —
Lex177
Тоже вариант. Так может, стоит убрать дубль?

#22:  Author: Tol!kLocation: Арзамас PostPosted: Tue Dec 06, 2016 18:43
    —
скрипт "Создание дерева папок согласно разделителя в имени файла\папки"
http://forum.wincmd.ru/viewtopic.php?p=56594#56594

#23:  Author: FlasherLocation: Москва PostPosted: Tue Dec 06, 2016 18:48
    —
Наоффтопили? Молодцы какие.
Поиск папок по части имени и перемещение в другой каталог
Перемещение файлов в одну папку
Список.

#24:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Dec 06, 2016 19:04
    —
Lex177
Своевременно воспользоваться поиском по форуму и в справке оказалось настолько непосильной задачей? Проще и веселее было затеять оффтопную дискуссию в теме, изначально, если чуток разобраться, не имевшей отношения к новому вопросу?
Замечание за нарушение правил форума. Заодно удалил пародию на код (иначе назвать не могу) из этого поста, а то кто-нибудь ещё не разберётся и попытается использовать...
Оффтоп вынужден оставить на месте, поскольку у всех вариантов его переноса есть какие-то недостатки.
А отвечавшим товарищам при всём уважении к их высокой эрудиции напоминаю, что повторные вопросы о том, что сто раз уже рассмотрено, есть повод для действий модератора — и не более того.

#25:  Author: Hjkma PostPosted: Mon Feb 12, 2018 11:21
    —
Хотелось бы чтобы скрипт мог перемещать файлы с длинными путями. Они не перемещаются, также как и не перемещаются файлы с длиной пути меньше 259 символов, но с маской будет больше 259 символов. Есть какие-нибудь решения?

#26:  Author: FlasherLocation: Москва PostPosted: Mon Feb 12, 2018 16:09
    —
Njkma, только более медленным пофайловым перебором с псевдокопированием и удалением исходников.

#27:  Author: Hjkma PostPosted: Mon Feb 12, 2018 17:28
    —
Flasher
Устроит и медленная скорость, сделайте, пожалуйста, если не сложно. Как и раньше, лучше чтобы можно было самому вписывать маски в код, в параметры они не влезают. Спасибо.

#28:  Author: FlasherLocation: Москва PostPosted: Mon Feb 12, 2018 21:20
    —
Hjkma
ОК, но не факт, что баги, если возникнут, удастся убрать:
Code:
'=================== VBS ===================
' Переместить файлы из каталога под курсором
' в папки с именами соответствующих им масок
' Параметр: %V
'===========================================
Option Explicit : Dim Filt, Fold, Rgx, REx, FSO, File,_
Strm, List, TName, Mask, IPath, OPath, FPath, IsMask, c
'===================== Маски файлов через "|" =====================
Filt = "12*.*|name 1.txt|name 1*.txt|name *1.*|name2.txt|2.txt|" &_
"name 2.txt|name *2.txt|name 2*.*|name 2.*|name*.txt|*name*|*2*" &_
"|name 3.*|name3.txt|*3*.txt|name 4.txt|name *4*.txt|*5*.txt|*5*"
'==================================================================
Fold = WSH.Arguments(0)
Set Rgx = New RegExp : Rgx.Global = True
Rgx.MultiLine = True : Rgx.IgnoreCase = True
Set REx = New RegExp : REx.Pattern = "([?[\]}{.^$+\-])"
Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO
  If Not .FolderExists(LP(Fold)) Then WSH.Quit
  Set Strm = CreateObject("SAPI.SpFileStream")
  For Each File in .GetFolder("\\?\" & Fold).Files
    List = List & vbLf & .GetFileName(File)
  Next
  TName = .GetBaseName(.GetTempName)
  For Each Mask in Split(Filt, "|")
    Rgx.Pattern = "^" & Replace(REx.Replace(Mask, "\$1"), "*", ".*") & "$"
    If Rgx.Test(List) Then
      OPath = LP(.BuildPath(Fold, Replace(Mask, "*", ChrW(-246))))
      IsMask = InStr(OPath, ChrW(-246))
      For Each File in Rgx.Execute(List)
        IPath = LP(.BuildPath(Fold, File))
        If .FileExists(IPath) Then
          If IsMask = 0 Then
            If Left(IPath, 1) <> "\" Then
              .GetFile(IPath).Name = File & TName
            Else CreateForLong IPath, LP(IPath & TName) End If
            IPath = LP(IPath & TName)
          End If
          If Not .FolderExists(OPath) Then .CreateFolder OPath
          FPath = LP(.BuildPath(OPath, File)) : c = 2
          While FSO.FileExists(FPath)
            FPath = FPath & " (" & c & ")" : c = c + 1
          Wend : FPath = LP(FPath)
          If Left(IPath, 1) = "\" Or Left(FPath, 1) = "\" Then _
          CreateForLong IPath, FPath Else .MoveFile IPath, FPath
        End If
      Next
    End If
  Next
End With : Set FSO = Nothing
Set Rgx = Nothing : Set Strm = Nothing
MsgBox Space(16) & "Выполнено!", 4160,_
" Перемещение файлов в папки-маски      "

Sub CreateForLong(Input, OutPut)
  With Strm
    Dim Size, All : Size = FSO.GetFile(Input).Size
    .Format.Type = 1 : .Open Input, 1 : .Read All, Size : .Close
    .Open OutPut, 3, True : .Write All : All = "" : .Close
  End With : FSO.DeleteFile Input
End Sub

Function LP(F)
  LP = F : If Len(F) > 259 And Left(F, 1) <> "\" Then LP = "\\?\" & F
End Function


Last edited by Flasher on Tue Feb 13, 2018 00:11; edited 6 times in total

#29:  Author: Hjkma PostPosted: Mon Feb 12, 2018 22:19
    —
Flasher
Запустил скрипт, но что-то не все файлы отправились, скрипт в каждую папку переместил по одному файлу (1 папка - 1 файл), а остальные файлы остались на месте.

#30:  Author: FlasherLocation: Москва PostPosted: Mon Feb 12, 2018 22:26
    —
Hjkma
Совсем одну вещь прозевал. См. теперь.

#31:  Author: Hjkma PostPosted: Mon Feb 12, 2018 22:36
    —
Flasher
Теперь пишет ошибку:
Quote:
Строка: 36
Символ: 44
Ошибка: Файл уже существует
Код: 800A003A
Источник: Ошибка выполнения Microsoft VBScript

Запускаю скрипт на папке, нету подпапок, только файлы лежат. Кажется это проблема связана с тем, что есть 2 и больше файлов, которые соответствуют одной маске. Если одной маске соответствует только один файл, то ошибка не появляется. И еще один баг заметил, не отправляются файлы, названия у которых не соответствуют регистрам масок. То есть, если названия файлов сделать капсом, а маски только строчным, то они не отправляются в папки.

#32:  Author: FlasherLocation: Москва PostPosted: Mon Feb 12, 2018 22:47
    —
Hjkma
Наоборот. 36 строка касается маски без *, т. е. как раз ситуации, при которой возможно одно ссответствие.
Регисрозависимость убрал.

#33:  Author: Hjkma PostPosted: Mon Feb 12, 2018 22:52
    —
Flasher
Я имею в виду маски с *, у меня все маски с *. Ошибка все еще присутствует. Проблема с регистрозависимостью снялась.

#34:  Author: FlasherLocation: Москва PostPosted: Mon Feb 12, 2018 22:54
    —
Hjkma
Судя по тому, что маски задавались в другом числе строк, то было бы логично указать не номер строки, а саму строку.

#35:  Author: Hjkma PostPosted: Mon Feb 12, 2018 22:56
    —
Flasher
С новым вариантом это уже строка 37, вот
Quote:
If Not .FolderExists(OPath) Then .CreateFolder OPath

#36:  Author: FlasherLocation: Москва PostPosted: Mon Feb 12, 2018 23:10
    —
Hjkma
В исходнике 39-я. Нужен пример источника, нескольких файлов в нём и получателя.

#37:  Author: Hjkma PostPosted: Mon Feb 12, 2018 23:14
    —
Flasher
До запуска скрипта (навожу курсор на папку test):
Quote:
d:\test\31724013194 - anri sugihara_3.jpg
d:\test\31724013194 - anri sugihara_4.jpg
d:\test\31724013194 - anri sugihara_5.jpg

После запуска ошибка, только один файл отправляется:
Quote:
d:\test\*anri sugihara*\31724013194 - anri sugihara_3.jpg
d:\test\31724013194 - anri sugihara_4.jpg
d:\test\31724013194 - anri sugihara_5.jpg

Про источник и получатель не понял. Если имеются в виду панели, то я просто в одной панели навожу на папку и файлы отправляются внутри этой папки в подпапки (сейчас только по одному файлу в одну папку).

#38:  Author: FlasherLocation: Москва PostPosted: Mon Feb 12, 2018 23:24
    —
Hjkma
Исправил.

#39:  Author: Hjkma PostPosted: Mon Feb 12, 2018 23:54
    —
Flasher
Запустил новый вариант скрипта на папке, содержащем большое количество файлов, и вылезла ошибка, на этот раз другая:
Quote:
Строка: 44
Символ: 43
Ошибка: Недопустимый вызов или аргумент процедуры

Строка 44 у меня вот эта:
Quote:
CreateForLong IPath, FPath Else .MoveFile IPath, FPath

Локализировать ошибку сходу не удалось. Пробовал запустить скрипт на папке с небольшим количеством файлов, не вылезла ошибка и файлы отправились в подпапки. Пробовал повторно запустить скрипт на том самом папке с большим количеством файлов, снова та же ошибка. Завтра попробую перебирать маски и файлы, попробую выяснить на чем скрипт спотыкается.
upd. Кажется, понял. Проблема с файлами, с длиной пути меньше 259 символов, но, которые будут иметь длину больше 259 символов, если они переместятся в подпапки с названиями масок. Файлы с длиной пути больше 259 символов перемещаются нормально.

#40:  Author: FlasherLocation: Москва PostPosted: Tue Feb 13, 2018 00:01
    —
Hjkma
Неполная правка была. Строкой выше заменил OPath на FPath.

#41:  Author: Hjkma PostPosted: Tue Feb 13, 2018 00:15
    —
Flasher
Запустил и все успешно отправилось. Теперь скрипт работающий. Большое вам спасибо за помощь, скрипт и терпение!

#42:  Author: FlasherLocation: Москва PostPosted: Tue Feb 13, 2018 00:25
    —
Hjkma
Чуть ранее ещё одной строкой выше кое-что добавлял на всякий.
На доброе пользование.



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group