Перечень файлов и каталогов с подкаталогами с wildcard-ами

Здесь обсуждается всё, что касается макросов.
Post Reply
buniak_a_h
Posts: 582
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 57 times
Been thanked: 13 times
Contact:

Перечень файлов и каталогов с подкаталогами с wildcard-ами

Post by buniak_a_h » Sun 29 Apr, 2018 01:11

Написал небольшую функцию для составления списка файлов и каталогов, подходящих по маске. В отличие от "обычных" масок эта функция понимает wildcard-ы в промежуточных каталогах. Например, осуществляет поиск по маске %TEMP%\18*\update.7z и даже *:\Program Files*\wi* или [c-d,y]:\Program Files*\wi* Особенно удобно бывает для поиска "потерянных" файлов. Также собираюсь (если автор разрешит) встроить в скрипт BookmarkManager.lua для перехода при неполном задании путей Менеджер закладок с использованием этой процедуры...
  1. --[[
  2. WildCardSearch.lua
  3. поиск файла по частично известному пути
  4. Запуск:
  5. lua:@WildCardSearch.lua
  6. Буняк А.Х.©
  7. --]]
  8. local function _FillSubdirs( sFull )
  9.  
  10.   local function _SplitPath(sn)
  11.    local res, t={}
  12.    while sn and sn~='' do
  13.     t,sn = sn:match([[^([^\]*)\?(.*)$]])
  14.     if t and t ~= '' then res[#res+1] = t end
  15.    end
  16.    return res
  17.   end
  18.  
  19.   -- Начало _FillSubdirs
  20.   local aDirs=_SplitPath( sFull )
  21.   if #aDirs == 0 then return end
  22.   local aRes={}
  23.   local Root=aDirs[1]:upper()
  24.   table.remove(aDirs, 1)
  25.   do
  26.     if Root:sub(1,2):match('^[A-Z]:$') then
  27.       aRes[1] = Root .. '\\'
  28.     else
  29.       for i=mf.asc('A'),mf.asc('Z') do
  30.         local d=mf.chr(i)..':'
  31.         if Root == '*:' then
  32.           aRes[#aRes+1] = d .. '\\'
  33.         else
  34.           if d:match(Root) then
  35.             aRes[#aRes+1] = d .. '\\'
  36.           end
  37.         end
  38.       end
  39.     end
  40.   end
  41.   local function _ListFolders(root, mask)
  42.     local ares={}
  43.     local function _LiFoProc(_,nf)
  44.       ares[#ares+1] = nf
  45.     end
  46.     far.RecursiveSearch(root, mask, _LiFoProc)
  47.     if #ares == 0 then ares = nil end
  48.     return ares
  49.   end -- _ListFolders
  50.   while #aDirs > 0 do
  51.     local n=#aRes
  52.     for i=1,n do
  53.       local aList = _ListFolders(aRes[i], aDirs[1])
  54.       if aList then
  55.         for _,v in ipairs(aList) do table.insert(aRes, v) end
  56.       end
  57.     end
  58.     -- Удаляю необработанные
  59.     for _=1,n do table.remove(aRes, 1) end
  60.     table.remove(aDirs,1)
  61.   end
  62.   return aRes
  63. end -- _FillSubdirs
  64.  
  65. local sFull = [[*:\Program Files*\wi*]]
  66. sFull = mf.prompt('Расширение каталогов','Полный путь с wildcard-ами',21,sFull)
  67. local aList=_FillSubdirs(sFull)
  68. far.Show(unpack(aList))
  69.  
Attachments
WildCardSearch.lua.7z
(1015 Bytes) Downloaded 25 times
Last edited by buniak_a_h on Sun 29 Apr, 2018 02:33, edited 1 time in total.

Post Reply

Return to “Обсуждение макросов”