LINUX.ORG.RU
ФорумAdmin

Как установить и затем удалить кучу файлов и каталогов из системы?

 ,


0

1

Здравствуйте. Экспериментирую с различными прошивками и их параметрами на встраиваемой системе, то есть ни пакетного менеджера, ни какой-то виртуалки нет. Посоветуйте, пожалуйста, как можно избежать тут ручной работы: нужно на систему поставить содержимое tar архива, в разные каталоги. Но самое важное: потом нужно это же содержимое за собой прибрать, то есть удалить. Набор файлов каждый раз разный, немного - но меняется. Я думал про симлинки, но в содержимом они тоже есть, что может испортить каталоги. А как-то еще такую задачку можно решить? Закинуть на систему каталоги и файлы и потом их же позже удалить? Без виртуальных помощников и пакетных менеджеров?

Буду признателен за совет.


Как вариант делай через overlay. К примеру весь твой пакет это squash образ. Ты его монтируешь и через overlay отображаешь в /

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

зависимости то будут не на встроенной системе, а на внешней на которой пакман установлен. Каталоги встроенной просто монтируются на время установки и в них размешаются файлы согласно пакбилду

указать в параметрах нужные пути root корень встроенной системы

–root <путь> указать альтернативный корневой каталог

остальное можно на внешней

–dbpath <путь> указать альтернативное расположение базы данных

–cachedir <каталог> указать альтернативное расположение кэша

anonymous
()

це ж прямая работа для скриптов ??
создать: for на тысячу элементов touch $i
удалить: for на тысячу элементов rm $i
с каталогами аналогично, можно помудрить с вложенными циклами.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 2)
cd your-embedd-root
xzcat /distr/installed_package2remove.tar.xz |
    tar --list |
    awk 'NR>1 && $0!~/\/$/'|
    xargs -rd'\n' printf '[%s]\n'

После проверки заменяешь printf '[%s]\n' на rm. Пустые директории не удаляются. Но и полные тоже не удаляются, что хорошо, ты же не хочешь почистить /bin/.

PS Так можно следующим заходом почистить опустевшие директории:

xzcat /distr/installed_package2remove.tar.xz |
    tar --list |
    awk 'NR>1 && $0~/\/$/'|
    tac |
    xargs -rd'\n' rmdir
legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 2)
Ответ на: комментарий от netvis

Вопрос только что делать с каталогами, что есть и в tar и на системе. Вернее как я пойму, что каталог на системе надо оставить, а не удалять как пришедший из архива….

У вас так много каталогов нужных в системе которые вы не помните зачем они?

anc ★★★★★
()

Я обычно такое в виртуалке делаю, просто копирую образ виртуалки и после всех манипуляций если их действительно много удаляю копию. Ну а если надо на реальной машине, то скрипт делай, который сначала структуру каталогов проверит и сохранит куда надо вместе с именами файлов (тут только права надо не забыть сохранять, их тоже может переписать и глянуть что по ACL, оно тоже может быть и тогда их тоже надо хранить), потом распаковываешь что тебе надо и потом скриптом же убираешь мусор за собой (разница между тем что было и тем что стало, попутно возвращая права на оригинальные файлы, если они изменились и тебе это надо).

anonymous
()

если пересечений по каталогам нет и файлы не меняются, то не проще ли тупо монтировать tar архив?

vitus@vitus-home:~/devel/tools/ide$ apt show archivemount | grep -A 1 -i Description
Description: mounts an archive for access as a file system
 archivemount is a FUSE based file system for Unix variants, including Linux.
vtVitus ★★★★★
()
Ответ на: комментарий от vodz

Насчёт NR. Вышла засада.

Тестовый архив, которым я пользовался для проверки имеет метку tar c --label foobar. Метка отображается первой строкой в выхлопе tar list если она есть. И никак не отмечается и не отличается от имени файла или директории. При вызове tar list --verbose строка с меткой отмечается, но остальной выхлоп такой уродливый, что мне противно его парсить.

При этом для большинства тарболов в дикой природе моё NR>1 будет ошибкой.

Так что я не вижу правильного красивого лаконичного решения (мб есть какой-то распространенный альтернативный менее безумный читатель тарболов?).

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

Вот такое уверенно откусывает метку если она есть и не ломается, если она пустая, отсутствует (это не то же самое, что '') или совпадает с именем первого элемента в архиве:

comm -13 <(tar --test-label < t.tar) <(tar t < t.tar)

Мало кому захочется так заморачиваться, имхо. Можно ли пренебречь тарболами с метками?

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от vodz

Можно ещё так:

readarray HASLABEL < <(tar --test-label < t.tar)
awk -v skip=${#HASLABEL[@]} 'NR>skip && !/\/$/'

PS интересные факты:

  1. метка достается за О(1) даже из огромных сжатых архивов.
  2. tar не даёт поставить многострочную метку (экранирует сам).

PPS вариант с comm мне всё ещё нравится больше, он короче и «лишний» вызов тоже один. Подумать только, что задача «достать список файлов из архива» не такая тривиальная.

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

и «лишний» вызов тоже один

Да блин. Мне лень было расписывать и получилось коряво. Имелось в виду, что два <(cmd1) <(cmd2) - чистый башизм, а вот одну cmd1 на shell легко:

{ IFS= read -r l1 ; read l2 ; } << EOF
$(tar --test-label -f "$TAR"; echo label)
EOF

vodz ★★★★★
()