Страница 1 из 3

Выделение файлов по кол-ву символов в их имени

Добавлено: Пт июл 29, 2011 01:13
shveicar
Добрый вечер всем, на всякий случай - данная тема является продолжением темы выделенной по смыслу, в отдельный топик. Обсуждение:
Есть ли возможность написать скрипт, который выделяет файлы и папки в текущей панели Тotal commander исходя из длинны символов в их имени?
Flasher писал(а):
Чисто из любопытства, примеры подобного удобства можно привести?
пожалуйста, вот фрагмент из файла списка

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

U:\klara\cdn.clara-g.com\CLARA-SHOW-D-013-1\Video\207CLARA-SHOW-D-013-1_video_640x368.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-D-013-1\Video\208CLARA-SHOW-D-013-1-1280x720.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-D-013-2\SplittedVideos\500CLARA-SHOW-D-013-2-part1.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-D-013-2\SplittedVideos\519CLARA-SHOW-D-013-2-part9.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-D-013-2\SplittedVideos\523CLARA-SHOW-D-013-2-part7.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-D-013-2\SplittedVideos\531CLARA-SHOW-D-013-2-part3.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-D-013-2\SplittedVideos\533CLARA-SHOW-D-013-2-part2.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-D-013-2\Video\498CLARA-SHOW-D-013-2_video_640x368.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-D-013-2\Video\499CLARA-SHOW-D-013-2-1280x720.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-E-008-1\SplittedVideos\390CLARA-SHOW-E-008-1-part4.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-E-008-1\SplittedVideos\392CLARA-SHOW-E-008-1-part3.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-E-008-1\SplittedVideos\394CLARA-SHOW-E-008-1-part2.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-E-008-1\SplittedVideos\396CLARA-SHOW-E-008-1-part1.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-E-008-1\SplittedVideos\626CLARA-SHOW-E-008-1-part9.wmv
U:\klara\cdn.clara-g.com\CLARA-SHOW-E-008-1\Video\382CLARA-SHOW-E-008-1_video_640x368.wmv
очевидно что файлы можно отсортировать, по числу символов в имене и удобно их выделить, а затем создать файл список.
Кстати, это кол-во включает точку и расширение?
Это как вам удобней, при создании скрипта, если это не вызывает дополнительных трудностей, можно добавить. (тогда (.),(_),(-) тоже можно считать символом)[/mod]

Добавлено: Пт июл 29, 2011 01:30
Flasher
shveicar писал(а):очевидно что файлы можно отсортировать, по числу символов в имене и удобно их выделить, а затем создать файл список.
Примерно понятно, о чём речь.
shveicar писал(а):Это как вам удобней, при создании скрипта, если это не вызывает дополнительных трудностей, можно добавить.
Тут моё удобство ни при чём. Расширение у файлов может иметь разное число символов. Вопрос в том, как производить подсчёт - по полному имени или по базовому?

Добавлено: Пт июл 29, 2011 01:37
shveicar
Вопрос в том, как производить подсчёт - по полному имени или по базовому?
Тогда, лучше по полному, да и потом, если будет окно, для ввода нужного количества символов, всегда можно соорентироваться в правильности выбора тех, или иных файлов.

Добавлено: Пт июл 29, 2011 01:55
Rodny
Пока Flasher скрипт сочиняет, предлагаю альтернативное решение: сохранить поиск с плагином: "filex.Длина имени=...", вызывать кнопкой "LOADSEARCH имя_шаблона"

Добавлено: Пт июл 29, 2011 02:15
shveicar
Спасибо Rodny - но только этот совет, помогает упростить первоначальную сортировку,(первоначальный список ведь может быть, весьма длинным) а скрипт создаваемый Flasher поможет, (я надеюсь) произвести детализацию, например группового переименования и т.д

Добавлено: Пт июл 29, 2011 03:34
Flasher
Что-то вроде того (путь запуска очистить):

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

' Выделение элементов в файловой панели по числу символов в имени
' Необходима регистрация Script Helper ActiveX for TC
'===============================================
Types = InputBox("Введите 1/2, если требуются выделить файлы/папки:", "Выделение элементов списка по длине имён", "1")
Name = InputBox("Введите число символов:", "Выделение элементов списка по длине имён")
If Len(Name) = 0 Or Not IsNumeric(Name) Then WScript.Quit

With CreateObject("Scripting.FileSystemObject")
  Set CD = .GetFolder(CreateObject("WScript.Shell").CurrentDirectory)
  If Types = 1 Then
    For Each F in CD.Files
      If Len(F.Name) = Abs(Name) Then A = A  & vbnewline & F
    Next
  ElseIf Types = 2 Then
    For Each F in CD.SubFolders
      If Len(F.Name) = Abs(Name) Then A = A  & vbnewline & F & ""
    Next
  Else MsgBox "Неверный ввод данных! Повторите попытку!", vbCritical
  End If
End With

With CreateObject("TCScript.Helper")
  T = .GetTextFromClip
  .SetTextToClip(A)
  .SendCommand 2033, True
  .SetTextToClip(T)
End With

Wscript.Quit
shveicar писал(а):чтобы создать затем файл список
Кстати, файл-список создать проще, чем выделить, и будет полноценно портабельный вариант.
Rodny писал(а):"filex.Длина имени=..."
Я сперва подумал, что так файлы и сортируются:
shveicar писал(а):файлы можно отсортировать

Добавлено: Пт июл 29, 2011 07:55
Avada
shveicar
Попрошу впредь соблюдать правила русского языка хотя бы в заголовке темы, а также не выделять ссылки полужирным шрифтом — они и так отлично видны.
Соответствующие правки сделаны.

Добавлено: Пт июл 29, 2011 09:52
MVV
А чем плох вариант выделения файлов с заданной длиной имени через банальное окно расширения выделения, вызываемое клавишей Num+? Или он слишком банален?

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

<^.{1,7}$
Добавляет к выделению все файлы с длиной имени от 1 до 7 символов (включая точку).

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

<^.{7,}$
Добавляет к выделению все файлы с длиной имени от 7 символов (включая точку). Если запятую убрать, то будут выделяться файлы с именами длиной ровно 7 символов.

Да и через упомянутое поле плагина, возвращающее длину имени, можно создать шаблон и использовать его в этом же окне выделения файлов. Правда, так нельзя будет менять числа на лету, в отличие от регулярного выражения.

Добавлено: Пт июл 29, 2011 11:34
shveicar
Avada- Извиняюсь, на будущее учту.
Flasher- Спасибо скрипт работает, (просто и изящно)
Единственное, можно ли на базе, например этого скрипта

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

/* ====================================
   Подсчет количества выделенных файлов
   Параметры вызова из TC:
   %L
==================================== */
var objArgs, FSO, TextFile, i = 0;
objArgs = WScript.Arguments;
FSO = new ActiveXObject("Scripting.FileSystemObject");
TextFile = FSO.OpenTextFile(objArgs(0));
while (!TextFile.AtEndOfStream)
{
  i++;
  TextFile.SkipLine();
}
TextFile.Close();
WScript.Echo("Выделено " + i + " файлов");
(расширение .js) сделать скрипт дополняющий - Ваш вариант, подсчетом символов в имене файла. То-есть выделяем файл или папку, жмем кнопку, запускаем Ваш скрипт и после первого окошка-выбора папки или файла, сразу, во втором вводим нужное количество символов из буфера обмена, преобразованного с помощью скрипта в цифры, При автоматизации процесса, это было-бы очень удобно.
Кстати, файл-список создать проще, чем выделить, и будет полноценно портабельный вариант
Конечно файл список- создать проще, но отфильтровать имена в нем, не всегда просто (для начала мешает знак \)и некоторые другие, моменты.
MVV
А чем плох вариант выделения файлов с заданной длиной имени через банальное окно расширения выделения
- Во первых, данный способ не позволяет выбрать режим выделения(файлы или папки), во вторых, выделяется все имена - в том числе и те, которые имеют меньшее количество символов. Ну а в третьих речь идёт именно об автоматизации процесса и экономии времени при работе с большим количеством информации, но тем не менее,- Спасибо.

Добавлено: Пт июл 29, 2011 12:23
Flasher
shveicar писал(а):во втором вводим нужное количество символов из буфера обмена
Зачем вводить (второе окно), если можно число из буфера уже в скрипте задействовать? Только я не понял, при чём тут приведённый js-скрипт? Его же подклеивать не надо, если речь только о буфере?
shveicar писал(а):Конечно файл список- создать проще, но отфильтровать имена в нем, не всегда просто (для начала мешает знак \)и некоторые другие, моменты.
Не понял насчёт знака. Где он мешает? Отфильтровать можно и в скрипте, смотря какая задача.
shveicar писал(а):Во первых, данный способ не позволяет выбрать режим выделения(файлы или папки), во вторых, выделяется все имена - в том числе и те, которые имеют меньшее количество символов. Ну а в третьих речь идёт именно об автоматизации процесса и экономии времени при работе с большим количеством информации, но тем не менее
Ну, способ, конечно, ещё тот, но свести к автоматизации тоже не проблема:

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

' Выделение элементов в файловой панели по числу символов в имени
'===============================================
Types = InputBox("Введите 1/2/3, если требуются выделить всё/файлы/папки:", "Выделение элементов списка по длине имён", "2")
If Not IsNumeric(Types) Then Call A
If Types > 3 Then Call A
Name = InputBox("Введите число символов:", "Выделение элементов списка по длине имён")
If Len(Name) = 0 Or Not IsNumeric(Name) Then WScript.Quit

With CreateObject("WScript.Shell")
  .Exec("%COMMANDER_PATH%\Utils\TCMC\TCMC.exe CM331"&Types)
  .SendKeys "<{^}.{{}"&Name&"{}}$~"
End With

WSCript.Quit

Sub A
  MsgBox "Неверный ввод данных! Повторите попытку!", vbCritical, "  Выделение элементов списка по длине имён"
  WScript.Quit
End Sub
Путь к TCMC должен соответствовать скриптовому.

Добавлено: Пт июл 29, 2011 14:02
shveicar
Зачем вводить (второе окно), если можно число из буфера уже в скрипте задействовать?
То есть вводить скопированное имя в окно скрипта? Кстати, последний вариант скрипта работать не хочет- все время выдает -что такие файлы не найдены ( причем пробовал водить в окне как готовое число так и имя).
Не понял насчёт знака. Где он мешает?
Здесь, Я имел ввиду что после создания файла списка, удалить из него лишние строки не всегда просто(имеется ввиду вариант типа словогрыз, или textpipe) программам не нравится знак(\) понятно, что его можно в блокноте поменять везде на/ а потом обрабатывать, но даже после этого, часто программы удаляют массив блоков, вместо нужных строк. Как я понял при создании файла списка, -в моем случае(это кнопка)

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

TOTALCMD#BAR#DATA
%ComSpec%
/c type "%L" >"%T\1filelist.txt"
%COMMANDER_PATH%\ico\74.ico
Список файлов в противоположной панели(полный путь)

1
-1
в него добавляются, какие-то скрытые символы и сами строки идут непрерывно, без пробелов и переноса строк. Во всяком случае- аналогичный список(например извлечение url адресов) созданный с помощью скрипта или самого textpipe- обрабатывается без проблем.

Добавлено: Пт июл 29, 2011 14:26
Flasher
shveicar писал(а):То есть вводить скопированное имя в окно скрипта?
Да - зачем?
На 2 вопроса я так ответа не получил...
shveicar писал(а):Кстати, последний вариант скрипта работать не хочет- все время выдает -что такие файлы не найдены ( причем пробовал водить в окне как готовое число так и имя).
При вводе текста скрипт закончит работу. Вводить надо число.
Насчёт "не хочет": в строке .SendKeystroke "^V~" если убрать "~", что будет в поле? Ещё такое окно может быть, если соотв. элементов с заданным числом символов нет в активной панели.
shveicar писал(а):удалить из него лишние строки не всегда просто(имеется ввиду вариант типа словогрыз, или textpipe) программам не нравится знак(\)
Ну так надо пользоваться софтом/скриптами, которые это умеют. Вообще я писал про скрипт создания файла-списка, в котором можно отфильтровать строки, убрать лишние символы и т.д. без всяких выделений файлов.

Добавлено: Пт июл 29, 2011 14:51
shveicar
Только я не понял, при чём тут приведённый js-скрипт?
Ну это я так привел, вдруг пригодится для создания нового скрипта.
Мой вопрос:
То есть вводить скопированное имя в окно скрипта?
Ваш ответ:
Да - зачем?
Я просто имел ввиду чтобы скрипт сам считал количество символов в выделенном имени, а как это реализовать -Вам видней.
если убрать "~", что будет в поле?
После ввода количества символов выскакивает окно "добавить выделение" -"укажите маску файлов"(разделитель...) и в поле стоит буква V
Ещё такое окно может быть, если соотв. элементов с заданным числом символов нет в активной панели.
Но предыдущий скрипт- ведь срабатывает! И кстати, интересно почему после первого срабатывания, первого скрипта
второй раз он уже не срабатывает(имеется ввиду после сброса выделенного), то -есть для повторного выделения других групп- приходится заново начинать поиск с маской(*.*) а только потом применять скрипт?
Вообще я писал про скрипт создания файла-списка, в котором можно отфильтровать строки, убрать лишние символы и т.д.
К сожалению, в моей коллекции такого нет.

Добавлено: Пт июл 29, 2011 15:05
Flasher
shveicar писал(а):После ввода количества символов выскакивает окно "добавить выделение" -"укажите маску файлов"(разделитель...) и в поле стоит буква V
Хм, стоит попробовать перед указаной строкой добавить:

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

  .Sleep 20
shveicar писал(а):Но предыдущий скрипт- ведь срабатывает!
Там последовательность цифр режима выделения другая. Может, не то вписывается?
shveicar писал(а):И кстати, интересно почему после первого срабатывания, первого скрипта
второй раз он уже не срабатывает(имеется ввиду после сброса выделенного)
Он должен срабатывать как с выделением, так и с его отсутсвием. Опять же можно поиграться со .Sleep N после .SetTextToClip(A).
shveicar писал(а):К сожалению, в моей коллекции такого нет.
Новая тема, новое ТЗ - пополнение колекции. :wink:

Добавлено: Пт июл 29, 2011 15:31
MVV
shveicar писал(а):MVV
А чем плох вариант выделения файлов с заданной длиной имени через банальное окно расширения выделения
- Во первых, данный способ не позволяет выбрать режим выделения(файлы или папки), во вторых, выделяется все имена - в том числе и те, которые имеют меньшее количество символов. Ну а в третьих речь идёт именно об автоматизации процесса и экономии времени при работе с большим количеством информации, но тем не менее,- Спасибо.
Неужели!
Num+ выделяет только файлы, Shift+Num+ - файлы и папки соответственно. И в настройках есть опция, позволяющая выбирать, что именно будет выделять просто Num+, а что - Shift+Num+. :wink:

А чтобы меньшее число символов не выделялось - я думал, что это очевидно - задай нижний и верхний предел длины равными, или используй вариант с точной длиной - я же разные варианты привёл. Выражение <^.{4,7}$ выделит имена с длиной от 4 до 7, выражения <^.{7,7}$ и <^.{7}$ - с длиной ровно 7 символов. В таком выражении символ < означает, что используется regex, символы ^ и $ - начало и конец имени, точка - любой символ, а выражение в скобках задает количество этих любых символов.

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