Групповое переименование

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Можно выбрать файлы по фильтру *.decrypted01.*, затем переименовать их в инструменте группового переименования с одновременным переносом в подпапку TEMP, для чего указать в поле “Маска для: имени файла” TEMP\[N], в поле “Найти:” .decrypted01, в поле “Заменить на:” <Пусто>. И наконец, переместить их обратно, заменив существующие.
P.S.
Пардон, я со своим ответом ошибся форумом. Это ж не "Общие вопросы"!
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Koter >>

Код: Выделить всё

'============================================================================= 
' Замена в именах выделенных элементов списка в активном каталоге ТС
' с удалением имеющихся элементов с аналогичными присвоенными именами

' Условие: путь запуска - пустой

' Параметры:
' 1) %WL
' 2) "<искомая строка>" (если нет, ввод в окне)
' 3) "<новая строка>" (если нет, ввод в окне - * в качестве пустой строки)
'============================================================================= 
With WScript.Arguments
  C = .Count : If C = 0 Then WScript.Quit
  List = .Item(0)
  If C > 1 Then Find = .Item(1) Else Chek Find, "заменяемый"
  If C > 2 Then Repl = .Item(2) Else Chek Repl, "новый"
End With : Dir = CreateObject("WScript.Shell").CurrentDirectory & "\"
On Error Resume Next
With CreateObject("Scripting.FileSystemObject") 
  For Each F in Split(.GetFile(List).OpenAsTextStream(1, -1).ReadAll, vbNewLine)
    If F <> "" Then
      If .FolderExists(F) Then
        Set FF = .GetFolder(F)
        If Find <> "" And InStr(FF.Name, Find) Then
          NewName = Replace(FF.Name, Find, Repl) : NewF = Dir & NewName
          If .FolderExists(NewF) Then .DeleteFolder NewF
        End If
      ElseIf .FileExists(F) Then
        BN = .GetBaseName(F)
        If Find <> "" And InStr(BN, Find) Then
          Set FF = .GetFile(F)
          NewName = Replace(BN, Find, Repl) & "." & .GetExtensionName(F)
          NewF = Dir & NewName : If .FileExists(NewF) Then .DeleteFile NewF
        End If
      End If : FF.Name = NewName
    End If
  Next : Set FF = Nothing
End With : CreateObject("WScript.Shell").SendKeys "^R"

Sub Chek(Text, Word)
  Text = InputBox(String(5, vbnewline) & "Введите " & Word & " текст:", Space(10) & _
  "Замена имён выделенных файлов и папок", 3) : If Len(Text) = 0 Then WScript.Quit
  If Trim(Text) = "*" Then Text = ""
End Sub
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Koter
Сообщения: 3
Зарегистрирован: Ср апр 10, 2013 23:08

Сообщение Koter »

то sa

Ну, так можно было бы, но надо же пути сохранить... Это же простой пример. А их там 79тыс. файлов.... и это только на одном из логических дисков в разных каталогах и подкаталогах.

Это у меня произошло после попадания вируса, закодировались все файлы с расширением rar, doc,docx,xml,xls,xlsx,dbf..... и прочие несущие личною и прочую информацию файлы фото, музыка, текст, базы, отчетность бух...

Спасибо ДрВебовцам, помогли с лекарством, И СПАСИБО - ГУРУ! Flasher -у!
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Если папок много, то перед запуском группового переименования стоит нажать Ctrl+B (или Ctrl+Shift+B). Чтобы не возиться с папками TEMP, можно добавить к переименовываемым файлам (выбранным по *.decrypted01.*) новое расширение, скажем YYYY, то есть в поле имя оставить [N], в поле расширения ввести [E].YYYY, в поле “Найти:” .decrypted01, в поле “Заменить на:” <Пусто>. Затем поиском найти все файлы *.YYYY, вывести их на панель и по Shift+F6 переименовать в *, заменив существующие.
Koter
Сообщения: 3
Зарегистрирован: Ср апр 10, 2013 23:08

To sa

Сообщение Koter »

НЕ Рабртает...
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Koter
Чтобы мой скрипт работал с результатами поиска или режимом без подкаталогов, мне в нём нужно внести лёгкую правку. Умысел работать только в активном каталоге заключался в возможности отслеживания изменений в нём, чтобы не промахнуться с выбором нужных файлов. Если это не особо нужно, то легко исправлю.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
RuMaS
Сообщения: 5
Зарегистрирован: Пн апр 15, 2013 14:45
Откуда: Odessa
Контактная информация:

Сообщение RuMaS »

Уважаемый Flasher,
Если бы Вы сделали такой скрипт, который находил бы файлы на локальных дисках во всех каталогах и подкаталогах по маске (например, "А") и заменял в имени файла "А" на "B", но с таким расчётом, что файл с "В" уже существует и его надо заменить.

По аналогии с запросом Koter, но на всех дисках (папках).
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

RuMaS писал(а):на всех дисках
И на съёмных тоже?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
RuMaS
Сообщения: 5
Зарегистрирован: Пн апр 15, 2013 14:45
Откуда: Odessa
Контактная информация:

Сообщение RuMaS »

Flasher писал(а):
RuMaS писал(а):на всех дисках
И на съёмных тоже?
Есть карман, не знаю - он считается съемным?
(или, как вариант, чтоб можно было выбрать диск, для которого провести данную операцию... или текущий?)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

RuMaS писал(а):Есть карман, не знаю - он считается съемным?
Конечно (USB/eSATA).
>>

Код: Выделить всё

'=============================================================================
' Замена в базовых именах файлов структуры активного диска или всех дисков
' с удалением имеющихся файлов с аналогичными присвоенным именами

' Условие: путь запуска - пустой

' Параметры:
' 1) <активный диск / все диски: 1/2>
' 2) "<искомая строка>" (если нет, ввод в окне)
' 3) "<новая строка>" (если нет, ввод в окне - * в качестве пустой строки)

' Автор: Flasher ©
'=============================================================================

With WScript.Arguments
  C = .Count
  If C = 0 Then MsgBox "Не задан первый параметр!", 48 : WScript.Quit : End If
  If C > 1 Then Search = .Item(1) Else Msg Search, "заменяемый"
  Disks = .Item(0) : If C > 2 Then NewStr = .Item(2) Else Msg NewStr, "новый"
End With

Set FSO = CreateObject("Scripting.FileSystemObject")
Dim WSH : Set WSH = CreateObject("WScript.Shell")
If Disks = 1 Then
  Drive = FSO.GetDriveName(WSH.CurrentDirectory) & ""
  ForDrive Drive, Search, NewStr
ElseIf Disks = 2 Then
  For Each D in FSO.Drives : ForDrive D, Search, NewStr : Next
End If : WSH.SendKeys "^R" : WSH.Popup "Файлы переименованы!", 2, "    Результат", 64 
Set WSH = Nothing : Set FSO = Nothing : WScript.Quit

Sub Msg(Text, Word)
  Text = InputBox(String(5, vbnewline) & "Введите " & Word & " текст:", Space(10) & _
  "Замена имён файлов и папок", 3) : If Len(Text) = 0 Then WScript.Quit
  If Trim(Text) = "*" Then Text = ""
End Sub

Sub ForDrive(Drv, Find, Repl)
  DT = FSO.GetDrive(Drv).DriveType : Set DFiles = FSO.GetFolder(Drv).Files
  If DT > 0 And DT < 4 Then
    If DFiles.Count > 0 Then ForFile DFiles, Find, Repl, Drv
    ForFolder Drv, Find, Repl
  End If
End Sub

Sub ForFolder(Fold, Find, Repl)
  Set SubF  = FSO.GetFolder(Fold).SubFolders
  If SubF.Count > 0 Then
    For Each Folder in SubF
      ForFolder Folder, Find, Repl
      Set FF = Folder.Files
      ForFIle FF, Find, Repl, Folder & ""
    Next
  End If
End Sub

Sub ForFile(DFil, Find, Repl, Dir)
  On Error Resume Next
  For Each File in DFil
    BN = FSO.GetBaseName(File)
    If Find <> "" And InStr(BN, Find) Then
      NewName = Replace(BN, Find, Repl) & "." & FSO.GetExtensionName(File)
      NewF = Dir & NewName : If FSO.FileExists(NewF) Then FSO.DeleteFile NewF
      File.Name = NewName
    End If
  Next
End Sub
Последний раз редактировалось Flasher Ср июн 12, 2013 12:43, всего редактировалось 1 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
visit120
Сообщения: 3
Зарегистрирован: Пн апр 29, 2013 19:37

Групповое переименование файлов внутри помеченных папок

Сообщение visit120 »

Очень занадобилась такая штука:
1. Имеется исходная папка (подобие каталога).
2. Внутри - находятся подпапки и файлы (и то и другое одновременно).
3. Внутри подпапок, в свою очередь находятся подпапки и файлы (этакое дерево...).
4. Помечаются необходимые папки и файлы (одновременно и то и другое) на каком либо уровне вложения.

Задача:
1. Переименовать все файлы, содержащиеся в помеченных подпапках, и далее на всех уровнях вложения.
2. Имена помеченных и вложенных подпапок - не переименовывать.
3. Переименовать, одновременно с содержимым подпапок, помеченные файлы на текущем уровне вложения.
4. Переименование производится транслитом.
5. Переименование должно производиться "в один присест" по клавише, либо по щелчку мышью.

Пробовал использовать маску для имени в групповом переименовании: , но она переименовывает и файлы (то, что нужно) и папки (а это - нельзя). А содержимое папок - остается неизменным.

Сломал уже всю голову, при поиске по форуму - ничего похожего не нашел (либо список вложенных файлов - либо переименование, но на одном уровне вложения).

Подскажите, хотя бы способ, каким можно эту задачу выполнить.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

visit120
А если после выделения нажать Ctrl+Shift+B и затем, выделив все файлы, выполнять групповое переименование?
visit120
Сообщения: 3
Зарегистрирован: Пн апр 29, 2013 19:37

Сообщение visit120 »

sa писал(а):
А если после выделения нажать Ctrl+Shift+B и затем, выделив все файлы, выполнять групповое переименование?
Спасибо!!! Работает чудесно.
Вот только как быть с п.5 - нужно как-то навесить эту последовательность действий на какую-нибудь кнопку. Как вообще это можно сделать (хотя бы способ) ???
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

visit120
Можно с помощью утилиты TCFS2 (отсюда). Предварительно надо создать команду em_MRT_Translit (на базе MULTIRENAME <имя шаблона>).
Кнопка примерно такая:

Код: Выделить всё

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe
/ef "tcm(2046, 1) tcm(3302, 1) delay(500) tem(`em_MRT_Translit`, 1) delay(500) send(`{ENTER}`, findwnd(`TMultiRename`)) delay(500) send(`{ESC}`, findwnd(`TMultiRename`)) tcm(540, 1)"
wcmicons.dll,70
В выделенном мультипереименовать все файлы пользовательской командой em_MRT_Translit


-1
Последний раз редактировалось sa Чт май 02, 2013 20:10, всего редактировалось 1 раз.
visit120
Сообщения: 3
Зарегистрирован: Пн апр 29, 2013 19:37

Сообщение visit120 »

для sa:
Можно с помощью утилиты TCFS2 (отсюда).
Попробовал понавесить все на кнопку (примерно тем же способом). Вроде - все работает.
Большущее Спасибо за помощь!!!
Ответить