есть много текстовых файлов в разных папках.
...
К тому же важен визуальный контроль за результатами изменений.
Звучит как противоречие

Но я пока даже не могу переименовать файл простым mv в этой программе почему-то
Попробовал с новым именем из выделенного текста
mv %s %t.txt
Вроде срабатывает.
У Zim большое сообщество? Возможно, под проблему с развалившимися абзацами кто-то плагин набросал?
Файлы всегда в UTF-8 и перевод строки "\n" (LF)?
Пользователь добавил сообщение 07 Декабря 2024, 08:45:13:
Как вариант, сохранить с расширением lua в UTF-8 без BOM:
-- (cross-platform)
--2024.12.09
--[[
Details: https://forum.ubuntu.ru/index.php?topic=322585.0
]]
local params = {...}
local function GetEOL(sF)
local h = io.open(sF, "rb")
if h == nil then return nil end
local sC = h:read(100)
h:close()
if string.find(sC, "\r\n", 1, true) ~= nil then return "\r\n" end
if string.find(sC, "\r", 1, true) ~= nil then return "\r" end
return "\n"
end
local function BackUp(sF)
local sUT = os.time()
os.rename(sF, sF .. "-" .. sUT .. ".bak")
end
local function FileExists(sF)
local h = io.open(sF, "rb")
if h == nil then
return false
else
h:close()
return true
end
end
local function GetUniqueName(sP, sN, sE)
local iC = 2
local sR = sP .. sN .. sE
if FileExists(sR) == true then
while true do
sR = sP .. sN .. "(" .. iC .. ")" .. sE
if FileExists(sR) == false then break end
iC = iC + 1
end
end
return sR
end
local function SplitName(sF)
local aR = {}
for n in string.gmatch(sF, "[^\\/]+") do table.insert(aR, n) end
return aR
end
local function CreationDate(sN)
local aM = {"января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"}
local aW = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"}
local dt = {}
dt.year, dt.month, dt.day = string.match(sN,"(%d%d%d%d)%-(%d%d)%-(%d%d)")
if dt.year == nil then return nil end
for k, v in pairs(dt) do dt[k] = tonumber(v) end
local sT = os.date("%m, %w", os.time(dt))
local iM, iW = string.match(sT,"(%d+), (%d+)")
iM = tonumber(iM)
iW = tonumber(iW)
return "Создано " .. aW[iW + 1] .. " " .. dt.day .. " " .. aM[iM] .. " " .. dt.year
end
local PathDelim
if string.find(package.path, "\\", 1, true) ~= nil then
PathDelim = "\\"
else
PathDelim = "/"
end
local aFile = SplitName(params[1])
local sEOL = GetEOL(params[1])
local h = io.open(params[1], "r")
if h == nil then return end
local aText = {}
local iC = 1
for l in h:lines() do
l = string.gsub(l, "[\r\n]+$", "")
aText[iC] = l
iC = iC + 1
end
h:close()
local sTmp, iTitle
iC = 1
while true do
if iC > #aText then break end
if string.sub(aText[iC], 1, 7) == "====== " then
iTitle = iC
break
end
iC = iC + 1
end
if iC >= #aText then return end
iC = iC + 1
while true do
if iC > #aText then break end
sTmp = string.match(aText[iC], "^(%d+): {text: '")
if sTmp ~= nil then
aText[iC] = string.gsub(aText[iC], "^%d+: {text: '", "", 1)
break
end
iC = iC + 1
end
if sTmp == nil then return end
if string.len(sTmp) == 1 then sTmp = "0" .. sTmp end
if aText[#aText] == "'}" then
aText[#aText] = ""
else
if aText[#aText - 1] == "'}" then
aText[#aText - 1] = ""
table.remove(#aText, #aText)
end
end
local sName = aFile[#aFile - 2] .. "-" .. aFile[#aFile - 1] .. "-" .. sTmp
if iTitle ~= nil then
sTmp = CreationDate(sName)
if sTmp ~= nil then
table.insert(aText, iTitle + 1, sTmp)
end
end
local sPath = table.concat(aFile, PathDelim, 1, #aFile - 1) .. PathDelim
if PathDelim == "/" then sPath = "/" .. sPath end
local sFile = GetUniqueName(sPath, sName, ".txt")
sTmp = table.concat(aText, sEOL)
h = io.open(sFile, "wb")
h:write(sTmp)
h:close()
BackUp(params[1])
Понадобится пакет lua5.1 или luajit (второй в теории пошустрее), запуск соответственно
lua5.1 скрипт %s
или
luajit скрипт %s
В теории кроссплаиформенный, но проверял только в Linux.
Если при этом получится автоматически удалить данный кусок текста, а также удалить в конце файла
Цитировать
'}
то будет вообще замечательно.
Вроде получилось.
Если найдена строка с "N: {text: '", то поправленное содержимое сохраняется в новый файл с нужным именем, оригинальный файл переименовывается в "староеимя-unuxtime.bak".
Последняя и предпоследняя строки проверяются на "'}", во втором случае с очисткой "'}" скрипт удаляет и последнюю строку.
Содержимое файла читается построчно в таблицу и чтобы не похерить тип окончания строки, предварительно считывается 100 байт для поиска (но это txt'шники Zim и по идее они не могут быть пустыми).
Если под Linux имя файла или папки может содержать "\", будут сюрпризы, надо будет как-то переделать получение нового имени.
На всякий случае разделитель каталогов ("\" или "/") определяется по значению
package.path.
Но т.к. файл лежит в папке "05", которая в свою очередь находится в папке "2014", то в конце концов имя файла должно стать 2014-05-06.txt.
Возможно ли такое, что в папке уже будет файл с нужным именем? Такое не предусмотрено и нужно будет подумать, как обходить.
Уф, вроде всё сказал, уточню на всякий: AS IS и т.д., если скрипт не будет сначала проверен на тестовой копии, то ССЗБ
