Как удалить из тар-архива несколько членов за один раз?

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
жучара
Сообщения: 1060
ОС: астралинукс

Как удалить из тар-архива несколько членов за один раз?

Сообщение жучара »

Друзья! Продолжаю ковыряться с таром. Вот тут вроде как написано, как
https://www.gnu.org/software/tar/manual/html_node/delete.html#delete

А за раз можно удалить несколько файлов? Можно, если в их именах нет пробелов:

Shell

Папку foo с файлами создадим:
$ rm -r foo
$ mkdir foo
$ touch foo/bar_0
$ touch foo/bar_1
$
Папку архивнём, члены архива глянем:

Shell

$ tar --create --file=foo.tar foo
$ tar tvf foo.tar
drwxr-xr-x user/user 0 2024-12-19 02:44 foo/
-rw-r--r-- user/user 0 2024-12-19 02:44 foo/bar_0
-rw-r--r-- user/user 0 2024-12-19 02:44 foo/bar_1
$
Члены foo/bar_0, foo/bar_1 архива удаляем, список членов архива смотрим:

Shell

$ sudo tar --delete --file=foo.tar foo/bar_0 foo/bar_1
$
$ tar tvf foo.tar
drwxr-xr-x user/user 0 2024-12-19 02:44 foo/
$
То есть что получилось. foo.tar разархивировали, из полученной папки удалили foo/bar_0 и foo/bar_1, снова сархивировали- (всё это фоном естественно). Я так предполагаю. По ссылке на это прямо ничто не указывает, просто сказано:
This operation will rewrite the archive.
Ну и эксперименты со временем тоже указывают на это.

...Но если в именах членов пробел, всё, туши свет. Зараз ничё не удалить. То есть идея какая. Создаём файл-список list.txt членов, а потом с этим файлом работаем. Создание list.txt опускаем:

Shell

$ mkdir foo
$ touch foo/bar
$ touch "foo/ba r"
$
$ tar --create --file=foo.tar foo
$
$ tar tvf foo.tar
drwxr-xr-x user/user 0 2024-12-19 02:59 foo/
-rw-r--r-- user/user 0 2024-12-19 02:59 foo/ba r
-rw-r--r-- user/user 0 2024-12-19 02:59 foo/bar
$
$ cat list.txt
'foo/ba r'
'foo/bar'
$
С этим списком я ничего не могу сделать. Пример:

Shell

$ tar --delete --file=foo.tar $(echo $(cat list.txt))
tar: 'foo/ba: Не найден в архиве
tar: r': Не найден в архиве
tar: 'foo/bar': Не найден в архиве
tar: Завершение работы с состоянием неисправности из-за возникших ошибок
$
Кавычки ему не понравились. В общем, разные варианты кавычек и слэшей не канают:

Shell

$ cat list.txt
"foo/ba r"
"foo/bar"
$
Не знаю даже, какие варианты пробовать. И без них нельзя- ибо пробелы.

По одиночке можно, конечно поудалять, используя, например, файл:

Shell

$ cat list.txt
foo/ba r
foo/bar
$
$
$ cat list.txt | while read LINE; do tar --delete --file=foo.tar "$LINE"; done
$
Но это, получается, например, удаляю 8 файлов, так восемь раз разархивирую-сархивирую архив. Время, знаете ли. В общем, спасибо, кто откликнется. Debian 12.
Я просто читаю маны.
Спасибо сказали:
math
Сообщения: 282
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: Как удалить из тар-архива несколько членов за один раз?

Сообщение math »

Не надо ни кавычек, ни экранирования. Вам надо перегнать содержимое списка в массив и использовать в команде его:

Shell

IFS=$'\n' arr=($(cat list.txt))
tar --delete --file=foo.tar "$arr[@]"
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1060
ОС: астралинукс

Re: Как удалить из тар-архива несколько членов за один раз?

Сообщение жучара »

math писал:
20.12.2024 01:48
Не надо ни кавычек, ни экранирования. Вам надо перегнать содержимое списка в массив и использовать в команде его:

Shell

IFS=$'\n' arr=($(cat list.txt))
tar --delete --file=foo.tar "$arr[@]"
увы, нет

Shell

$ mkdir foo
$ touch foo/bar
$
$ tar --create --file=foo.tar foo
$
$ echo foo/bar > list.txt
$
$ IFS=$'\n' arr=($(cat list.txt))
$ tar --delete --file=foo.tar "$arr[@]"
tar: В именах файлов используются символы подстановки
tar: Используйте --wildcards, чтобы задействовать эти символы, или --no-wildcards, чтобы убрать это предупреждение
tar: foo/bar[@]: Не найден в архиве
tar: Завершение работы с состоянием неисправности из-за возникших ошибок
$
...Можно, наверное, как сделать. Архив распаковать, ненужные члены удалить, снова запаковать. Но с инкрементным архивом такой номер, увы не пройдёт. Да и с временами путаница будет.
Я просто читаю маны.
Спасибо сказали:
math
Сообщения: 282
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: Как удалить из тар-архива несколько членов за один раз?

Сообщение math »

Фигурные скобки потерялись просто. Должно быть

Shell

$ tar --delete --file=foo.tar "${arr[@]}"
Спасибо сказали: