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 

Переименование файлов по списку (таблице) соответствий
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
myscience



Joined: 22 Mar 2016
Posts: 21

Post (Separately) Posted: Tue Mar 22, 2016 14:06    Post subject: Переименование файлов по списку (таблице) соответствий Reply with quote

Есть огромная таблица соответствия (1,5 млн строк) - старое имя файла и новое имя файла.
Но файлов в папке на порядки меньше, чем в таблице с именами.
Батник выполняется очень долго, т.к. перебирает подряд все файлы.
Можно ли сделать скрипт, который сначала из таблицы извлечет встречающиеся файлы, а потом их переименует?
Очень хочется ускорить и рационализировать процесс
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2514
Location: Большая деревня Москва

Post (Separately) Posted: Tue Mar 22, 2016 14:14    Post subject: Reply with quote

1) Тотал при чем?
2) Каков формат списка? Если он текстовый, например
Code:
старое_имя1.txt новое_имя1.tx1
старое_имя2.txt новое_имя2.tx1
то средствами текстового редактора в начале каждой строчки поставить ren и запустить как батник. Неверные команды просто будут проигнорированы.
Не забудь сохранить исходный список и потренироваться на кошках! (а то некоторые забывают)
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
myscience



Joined: 22 Mar 2016
Posts: 21

Post (Separately) Posted: Tue Mar 22, 2016 14:30    Post subject: Reply with quote

Батник есть, но он очень долго перебирает 1,5 млн строк.
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2514
Location: Большая деревня Москва

Post (Separately) Posted: Tue Mar 22, 2016 14:40    Post subject: Reply with quote

Ну, есть способ для эстетов-извращенцев.
1) Выделить все файлы в Тотале, сформировать список новых имен и нажать кнопку редактирования:
2) В тот же файл вставить имеющийся список;
3) Выделить в обоих списках повторяющиеся (то есть корректные) строки;
4) Из них сформировать искомый батник.
Тут все зависит от возможностей текстового редактора - может ли он выполнить пп. 3-4? Присмотрись к EmEditor'у - с помощью регулярных выражений он еще и не на такое способен...
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
myscience



Joined: 22 Mar 2016
Posts: 21

Post (Separately) Posted: Tue Mar 22, 2016 14:46    Post subject: Reply with quote

Хотелось бы автоматически, каким-нибудь скриптом. Важно найти наиболее рациональный по времени выполнения задания путь, т.к. процедуру необходимо повторять много раз.

Дело в том, что одни и те же файлы разбросаны по сотням подпапок. В каждой запускать батник - это на неделю)))
А сваливать все в одну кучу - не хочется терять структуру каталогов.
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 9024
Location: Россия, Саратов

Post (Separately) Posted: Tue Mar 22, 2016 15:21    Post subject: Reply with quote

myscience
Повторяю уже задававшийся вопрос: при чём тут Total Commander?
Под "групповым переименованием" без пояснений на данном подфоруме однозначно понимается инструмент группового переименования TC. Но к нему задача не относится по исходному условию с разным количеством файлов.
Скрипты и батники обсуждаются не в "Общих вопросах", а в подфоруме по автоматизации. Но и там предполагается всё же некая связь запрашиваемых действий с TC.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
myscience



Joined: 22 Mar 2016
Posts: 21

Post (Separately) Posted: Tue Mar 22, 2016 15:30    Post subject: Reply with quote

Мне заранее не было известно, что это к ТС не относится по исходному условию с разным количеством файлов.
Думал, что можно что-нибудь привинтить, чтоб получилось.
Можно ли перенести тему?
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 9024
Location: Россия, Саратов

Post (Separately) Posted: Tue Mar 22, 2016 15:46    Post subject: Reply with quote

myscience
Можно. Переношу. Заголовок несколько изменил.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
myscience



Joined: 22 Mar 2016
Posts: 21

Post (Separately) Posted: Tue Mar 22, 2016 15:59    Post subject: Reply with quote

Avada, спасибо.

Ускорит ли IF-оператор выполнение батника?
Какой командой можно быстро отсеять лишние строки?
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2514
Location: Большая деревня Москва

Post (Separately) Posted: Tue Mar 22, 2016 16:36    Post subject: Reply with quote

2myscience
Жди Tol!k'а. Он заместитель Всевышнего по батникам
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Tue Mar 22, 2016 22:58    Post subject: Reply with quote

myscience
1) Формат файла таблицы какой?
2) Юникод в именах есть или всё обыкновенно?
3) Имена файлов базовые или полные? Без путей?
4) Файлы в корне активной папки или во всей её структуре?
5) Если с присваеваемым именем файл уже существует, добавлять к имени счётчик или пропускать?
_________________________________________________
Ладно, ТпС убёг. Покажу, как думаю. Может, кому пригодится.
Code:
'••••••••••••••••••••••••••••••••• VBS •••••••••••••••••••••••••••••••••
' Переименовать файлы активной панели по текстовому списку соответствий,
' где между старым и новым именем стоит один запрещённый в именах символ
'
' Условия:   путь запуска пользоват. команды/кнопки должен быть пустым;
'            список соответствий должен быть сохранён в кодировке ANSI
'
' Параметры: "<Путь к файлу-списку>" <обработка структуры (нет/да): 0/1>
'•••••••••••••••••••••••••••••••••••••••••••••••••• Автор: Flasher © •••

Option Explicit : Dim A, Key, FSO, Con, RcS, _
WSH, FL, DB, Delim, Val, Var, Exs, Ext, T, C, i
Const Title = " Переименование файлов по базе соответствий"
Set A = WScript.Arguments : If A.Count < 2 Then _
MsgBox Space(15) & "Укажите 2 параметра!", 48, Title : WScript.Quit
Key = "HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Text\Format"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Con = CreateObject("ADODB.Connection")
Set RcS = CreateObject("ADODB.Recordset")
Set WSH = CreateObject("WScript.Shell")
DB = WSH.ExpandEnvironmentStrings(A(0))
If Not FSO.FileExists(DB) Then MsgBox "Файл-список отсутствует" &_
" по заданному пути:" & vbCr & A(0), 48, Title : WScript.Quit
FL = FSO.OpenTextFile(DB).ReadLine
With New Regexp
  .Pattern = "[""/*\\\t:;<>?]"
  If .Test(FL) Then
    Delim = .Execute(FL).Item(0).Value : If Delim = vbTab Then _
    Delim = "TabDelimited" Else Delim = "Delimited(" & Delim & ")"
  Else  MsgBox "На первой строке списка отсутствует " & _
  "запрещённый символ!", 48, Title : WScript.Quit :End If
End With : Val = WSH.RegRead(Key)
If Val <> Delim Then T = 1 : WSH.RegWrite Key, Delim, "REG_SZ"
Exs = FSO.GetParentFolderName(Key) & "\DisabledExtensions"
Ext = FSO.GetExtensionName(DB) : Var = WSH.RegRead(Exs)
If InStrRev(Var & ",", Ext & ",") = 0 Then _
C = 1 : WSH.RegWrite Exs, Var & "," & Ext, "REG_SZ"
Con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" &_
FSO.GetParentFolderName(DB) & "';Extended Properties='text;HDR=No'"
RcS.Open "SELECT * FROM " & FSO.GetFileName(DB), Con
FFolder FSO.GetFolder(FSO.GetAbsolutePathName(""))
If i <> "" Then _
WSH.Popup Space(29) & "Файлы переименованы!", 2, Title Else _
WSH.Popup Space(22) & "Файлы не соответствуют списку!", 2, Title
RcS.Close : If T Then WSH.RegWrite Key, Val, "REG_SZ"
Con.Close : If C Then WSH.RegWrite Exs, Var, "REG_SZ"

Sub FFolder(Folder)
  Dim F, N, BN, FP
  For Each F in Folder.Files
    RcS.Filter = "[" & RcS.Fields(0).Name & "] = '" & F.Name & "'"
    If Not RcS.BOF Then
      N = Trim(RcS.Fields(1).Value)
      If N <> "" Then
        BN = FSO.GetBaseName(N) : Ext = FSO.GetExtensionName(N)
        i = 0 : FP = Folder & "\" : If Ext <> "" Then Ext = "." & Ext
        While FSO.FileExists(FP & N) Or FSO.FolderExists(FP & N)
          i = i + 1 : N = BN & " (" & i & ")" & Ext
        Wend : F.Name = N
      End If
    End If
  Next : If A(1) = 1 Then _
  For Each F in Folder.SubFolders : FFolder F : Next
End Sub

_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
myscience



Joined: 22 Mar 2016
Posts: 21

Post (Separately) Posted: Thu Sep 29, 2016 18:51    Post subject: Reply with quote

Извините, пропал инет, не мог ответить. Sad

1) Формат файла таблицы какой?
csv, UTF-8
2) Юникод в именах есть или всё обыкновенно?
В целевых есть, UTF-8
3) Имена файлов базовые или полные? Без путей?
Без путей, в первой колонке текущее имя (файлы имеют имена без расширения), во второй - целевое имя, с расширением.
4) Файлы в корне активной папки или во всей её структуре?
Нужно рекурсивно
5) Если с присваиваемым именем файл уже существует, добавлять к имени счётчик или пропускать?
Добавлять счетчик, напр _2
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Fri Sep 30, 2016 18:37    Post subject: Reply with quote

Ушёл в моря. Пропал инет на 100 лет. Понятно..

Для UTF-8 без LogParser.dll, увы, не обойтись. Всё остальное было учтено.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
myscience



Joined: 22 Mar 2016
Posts: 21

Post (Separately) Posted: Fri Sep 30, 2016 18:47    Post subject: Reply with quote

Что это значит? Где почитать про LogParser.dll?
А если я сменю кодировку файла, пересохранив текстовым редактором, работать будет?
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Fri Sep 30, 2016 18:56    Post subject: Reply with quote

То и значит. Стандартным ADO это не решить. У LogQuery.CSVInputFormat есть возможность задать нужную кодовую страницу.
Пересохранение не получится при наличии юникодных символов.
Я, в принципе, могу переписать на LogParser с манифестом, но позже.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
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
Goto page 1, 2  Next
Page 1 of 2

 
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