LINUX.ORG.RU

bash, массовая работа с однокорреными файлами (удаление, поиск и т.д.)

 , ,


0

1

Всем привет!
Писал писал и написал скрипт для удаление устаревших модулей puppet
Сам скрипт вот тут https://github.com/patsevanton/delete-old-puppet-config/blob/master/SOURCES/d...
Но есть одна загвоздка
Puppet модули - а это обычные папки - могут быть однокорренными

Если Кратко, то задача сводится к следующему: Допустим есть 2 модуля (4 папки по 2 версии)

супер_пупер_service_report__v2_3_23_6
супер_пупер_service_report__v2_3_23_7
и
супер_супер_service__v1_0_46
супер_супер_service__v1_0_47

Из-за того что эти директории однокорренные, то происходит некорректное удаление не того модуля (не той директории)

Необходимо удалить старую версию модуля.

Вот пример

echo "./service_report__v1_0_46" | sed s/"service"__v//g | cut -d "/" -f 2 
service_report__v1_0_46
echo "./service_report__v1_0_46" | sed s/"service_report"__v//g | cut -d "/" -f 2 
1_0_46

Вот примерный отчет по работе скрипта там в части где идет работа с однокоренными модулями (папками)
module_name: service
./service_report__latest
./service_report__v1_0_46
last_module: service.report..v1.0.46
1-2
last_module:
service.report..v1.0.46
current_module:
service.report..v1.0.46
./service__v1_0_61
1-1
last_module:
service.report..v1.0.46
current_module:
1.0.61
previous_last_module:
service.report..v1.0.46
1-1-1
last_module:
service.report..v1.0.46
current_module:
1.0.61
previous_last_module:
1.0.61
./service__latest
./service__alternative
1-2
last_module:
service..alternative
current_module:
service..alternative
----------------------------------
./service_report__latest
./service_report__v1_0_46
2-1
last_module:
service..alternative
current_module:
service.report..v1.0.46
previous_last_module:
1.0.61
2-1-2
last_module:
service..alternative
current_module:
service.report..v1.0.46
previous_last_module:
service.report..v1.0.46
./service__v1_0_61
2-1
last_module:
service..alternative
current_module:
1.0.61
previous_last_module:
service.report..v1.0.46
2-1-3
last_module:
service..alternative
current_module:
1.0.61
previous_last_module:
service.report..v1.0.46
Подготовка к удалению
Разрешение зависимостей
--> Проверка сценария
---> Package service.puppet-config.noarch 0:1.0.61-1 will be для удаления
--> Проверка зависимостей окончена


Либо можно проще спросить: как разграничить работу с однокорреными директориями(удаление, поиск)?


Последнее исправление: chemtech (всего исправлений: 3)

Описание задачи крайне непонятное.

Предсказываю, что может помочь метчинг регэкспа с захватом кусков строки (capturing groups). Тогда вся строка однозначно распадётся на куски типа «пространство-имён, имя, версия» - это проще чем пытаться выдрать каждый кусок своим регэкспом, поскольку правило что «куски не накладываются и не имеют промежутков» тут выполняется автоматически.

capturing groups есть в любом удобном скриптовом языке, насчёт bash не уверен.

GPFault ★★
()
Ответ на: комментарий от GPFault

capturing groups есть в любом удобном скриптовом языке, насчёт bash не уверен.

Вектор BASH_REMATCH после проверки переменной по «=~» содержит значения из capturing groups

DRVTiny ★★★★★
()

Согласен, что непонятно чуть менее, чем всё. Автор, уточни, пожалуйста, что у скрипта на входе и что он делает (результат в виде удаления понятен), плюс - какой формат имени этих модулей puppet? Нечто же {{PACKAGE}}__{{VERSION}} ?

DRVTiny ★★★★★
()
Ответ на: комментарий от DRVTiny

Спасибо что ответили.

Дописал краткую задачу после слов: Если Кратко, то задача сводится к следующему:

chemtech
() автор топика
Ответ на: комментарий от chemtech

Ещё раз: что должно быть на входе скрипта?

Я могу посмотреть код скрипта позже, но их словесного описания вообще непонятно, откуда берётся подстрока service и почему нельзя просто разбить каждое имя файла на то, что до двух подчёркивания и то, что после?

DRVTiny ★★★★★
()
Ответ на: комментарий от DRVTiny

Спасибо за поддержку. Текущую задачу я поправил вот этим коммитом

https://github.com/patsevanton/delete-old-puppet-config/commit/984f4fde47ee53...

Сейчас осталось понять как исправить логические цепочки, которые сравниваются версии. Потому что если find сначала находит 12 версию, потом 13, потом 14 - он не удаляет 12 версию

Пробовал find /path/to/dir -type f -print0 | xargs -0 ls -lt не получается

i:
./service__latest
module_name:
service
dir:
./service__v1_2_12
dir_name:
service
last_module: 1.2.12
1-2
last_module:
1.2.12
current_module:
1.2.12
dir:
./service__v1_2_13
dir_name:
service
1-2
last_module:
1.2.13
current_module:
1.2.13
dir:
./service__v1_2_14
dir_name:
service
1-2
last_module:
1.2.14
current_module:
1.2.14


----------------------------------


dir:
./service__v1_2_12
dir_name:
service
2-1
last_module:
1.2.14
current_module:
1.2.12
previous_last_module:
1.2.12
dir:
./service__v1_2_13
dir_name:
service
2-1
last_module:
1.2.14
current_module:
1.2.13
previous_last_module:
1.2.12
2-1-2
last_module:
1.2.14
current_module:
1.2.13
previous_last_module:
1.2.13
dir:
./service__v1_2_14
dir_name:
service
2-2
last_module:
1.2.14
current_module:
1.2.14

chemtech
() автор топика
Последнее исправление: chemtech (всего исправлений: 2)
Ответ на: комментарий от chemtech

Если в строках 30 и 144 сделать так:

for dir in `find . -maxdepth 1 -name "$module_name"__v\* -print0 | xargs -0 ls -lrt`
То обратного порядка не будет
и вывод будет такой
./delete-old-puppet-config
i:
./service__latest
module_name:
service
dir:
итого
dir_name:
итого


----------------------------------


dir:
итого
dir_name:
итого

chemtech
() автор топика
#!/usr/bin/env python3
import itertools
import os
import shutil

VER_SEP = '__v'
WORK_DIR = './'

files = os.listdir(WORK_DIR)
groups = itertools.groupby(
    (f.split(VER_SEP) for f in files if VER_SEP in f),
    key=lambda x: x[0]
)

for group in groups:
    prefix = group[0]
    suffixes = sorted(x[1] for x in group[1])
    for suffix in suffixes[:-1]:
        path = VER_SEP.join((prefix, suffix))
        print('Deleting %s' % os.path.join(WORK_DIR, path))
        shutil.rmtree(os.path.join(WORK_DIR, path))
aedeph_ ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.