TAR: исключить одну из корневых папок архива

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС для молодых и начинающих системных администраторов.

Модератор: SLEDopit

Novascriptum
Сообщения: 40

TAR: исключить одну из корневых папок архива

Сообщение Novascriptum »

Здравствуйте, допустим, есть вот такая команда (составленная специально для теста опции --exclude):

Код: Выделить всё

tar -cf - /home/mytar/data -C /home/mytar data -C /home/mytar data2 --exclude="/data" > archive.tar

В результате в архиве:

Код: Выделить всё

/data
/data2
/home/mytar/data

А хотел опцией --exclude исключить корневую папку /data.

Если же написать --exclude="data", то пропадает и корневая папка архива /data, и /home/mytar/data. Как правильно написать, чтобы была исключена только корневая папка /data? Никак не выходит.
Спасибо сказали:

NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: TAR: исключить одну из корневых папок архива

Сообщение NickLion »

--exclude, ЕМНИП задаёт шаблон, попробуйте --exclude="/data/*"
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17706
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: TAR: исключить одну из корневых папок архива

Сообщение Bizdelnick »

А зачем Вы явно просите заархивировать каталог data, если он Вам не нужен?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Novascriptum
Сообщения: 40

Re: TAR: исключить одну из корневых папок архива

Сообщение Novascriptum »

NickLion писал(а):
05.05.2017 22:23
--exclude, ЕМНИП задаёт шаблон, попробуйте --exclude="/data/*"

Так тоже не работает, /data/ и её дочерние объекты не исключаются.

Bizdelnick писал(а):
05.05.2017 22:48
А зачем Вы явно просите заархивировать каталог data, если он Вам не нужен?

Затем, что я хочу разобраться, как работает exclude. До сих пор никаким способом не получается исключить корневой элемент архива. Либо без указания ведущего "/", либо никак. А если ведущий "/" не указывать, то попутно исключаются и все вложенные пути, подходящие под шаблон. Неужели это внутреннее ограничение самого TAR? Проверяю на версии 1.26.
Спасибо сказали:

Аватара пользователя
ieleja
Сообщения: 307
ОС: Debian 9, macOS, Windows

Re: TAR: исключить одну из корневых папок архива

Сообщение ieleja »

все работает

Код: Выделить всё

tar -zcvf all.tgz / \
--exclude=/bin \
--exclude=/boot \
--exclude=/dev \
--exclude=/home \
--exclude=/lib \
--exclude=/lib64 \
--exclude=/lost-found \
--exclude=/media \
--exclude=/mnt \
--exclude=/opt \
--exclude=/proc \
--exclude=/root \
--exclude=/run \
--exclude=/sbin \
--exclude=/selinux \
--exclude=/srv \
--exclude=/sys \
--exclude=/tmp \
--exclude=/usr \
--exclude=/var \
--exclude=/initrd.img \
--exclude=/vmlinuz


сделал архив от /etc

tar (GNU tar) 1.26
ad infinitum
Спасибо сказали:

Аватара пользователя
s.xbatob
Сообщения: 1105
ОС: Fedora

Re: TAR: исключить одну из корневых папок архива

Сообщение s.xbatob »

Novascriptum писал(а):
06.05.2017 04:30
Bizdelnick писал(а):
05.05.2017 22:48
А зачем Вы явно просите заархивировать каталог data, если он Вам не нужен?

Затем, что я хочу разобраться, как работает exclude. До сих пор никаким способом не получается исключить корневой элемент архива. Либо без указания ведущего "/", либо никак. А если ведущий "/" не указывать, то попутно исключаются и все вложенные пути, подходящие под шаблон. Неужели это внутреннее ограничение самого TAR? Проверяю на версии 1.26.

Сказал бы я, чьё это ограничение...
Вы же сами заказали взаимно исключающее: явно затребовали архивирование пути, который собрались исключать. Ну, проверили, у кого приоритет. :rolleyes:
Спасибо сказали:

Novascriptum
Сообщения: 40

Re: TAR: исключить одну из корневых папок архива

Сообщение Novascriptum »

s.xbatob писал(а):
06.05.2017 10:29
Сказал бы я, чьё это ограничение...
Вы же сами заказали взаимно исключающее: явно затребовали архивирование пути, который собрались исключать. Ну, проверили, у кого приоритет. :rolleyes:


Не согласен, если я явно указываю папку data, а в exclude - что нужно исключить /data/.hidden (конкретный файл) - не работает. Это тоже так задумано? Зачем вообще тогда нужен exclude?


ieleja писал(а):
06.05.2017 05:21
все работает

Код: Выделить всё

tar -zcvf all.tgz / \
--exclude=/bin \
--exclude=/boot \
...

сделал архив от /etc

tar (GNU tar) 1.26


Да, в вашем примере всё работает. Сделал по аналогии, тоже сработало вот так:

Код: Выделить всё

tar -cf - /home/mytar/data /home/mytar/data2 --exclude=/home/mytar/data > data.tar

То есть папка "data" в архиве отсутствует, а "data2" - присутствует. Но! Если я хочу указать не полный, а относительный путь до папки data, то exclude не получается задать никак.

Код: Выделить всё

cd /home/mytar
tar -cf - data data2 --exclude=/data

Как правильно?

Код: Выделить всё

cd /home/mytar
tar -cf - data data2 --exclude=/home/myTar/data

Так тоже не работает
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17706
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: TAR: исключить одну из корневых папок архива

Сообщение Bizdelnick »

Novascriptum писал(а):
06.05.2017 19:30
если я явно указываю папку data, а в exclude - что нужно исключить /data/.hidden (конкретный файл) - не работает

А почему Вы указываете путь от корня? Смотрите, какие пути внутри архива (tar -tf data.tar) и указывайте, как там.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Novascriptum
Сообщения: 40

Re: TAR: исключить одну из корневых папок архива

Сообщение Novascriptum »

Bizdelnick писал(а):
06.05.2017 19:48
Novascriptum писал(а):
06.05.2017 19:30
если я явно указываю папку data, а в exclude - что нужно исключить /data/.hidden (конкретный файл) - не работает

А почему Вы указываете путь от корня? Смотрите, какие пути внутри архива (tar -tf data.tar) и указывайте, как там.


Так я же оба варианта проверил. Что от корня файловой системы, что от корня архива - не работает. Если используются при добавлении абсолютные пути файлов - всё хорошо. Если относительные (включая параметр "-C") - не работает. А использование только абсолютных путей (без -C) сильно ограничивает функциональность.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17706
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: TAR: исключить одну из корневых папок архива

Сообщение Bizdelnick »

Novascriptum писал(а):
06.05.2017 20:19
Что от корня файловой системы, что от корня архива - не работает.

У tar-архива нет корня. В нём хранятся файлы и пути к ним. Пути могут быть абсолютные или относительные в зависимости от того, как создавали архив. Абсолютный путь /data в архиве может быть только в том случае, если Вы архивировали каталог /data (а не /home/mytar/data или ./data) или преобразовали путь с помощью опции --transform.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Novascriptum
Сообщения: 40

Re: TAR: исключить одну из корневых папок архива

Сообщение Novascriptum »

Bizdelnick писал(а):
06.05.2017 20:27
Novascriptum писал(а):
06.05.2017 20:19
Что от корня файловой системы, что от корня архива - не работает.

У tar-архива нет корня. В нём хранятся файлы и пути к ним. Пути могут быть абсолютные или относительные в зависимости от того, как создавали архив. Абсолютный путь /data в архиве может быть только в том случае, если Вы архивировали каталог /data (а не /home/mytar/data или ./data) или преобразовали путь с помощью опции --transform.


Я правильно понимаю, что из этого непременно следует, что если пути в архиве без ведущего "/" (а именно так происходит при использовании относительных путей при добавлении элементов в архив), то бесполезно в --exclude писать правило с ведущего "/"? И, следовательно, теряется возможность исключать "корневые" элементы архива, не исключая все остальные, содержащие аналогичный текст в своём полном пути?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17706
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: TAR: исключить одну из корневых папок архива

Сообщение Bizdelnick »

Novascriptum писал(а):
06.05.2017 21:18
Я правильно понимаю, что из этого непременно следует, что если пути в архиве без ведущего "/" (а именно так происходит при использовании относительных путей при добавлении элементов в архив), то бесполезно в --exclude писать правило с ведущего "/"?
Да.

Novascriptum писал(а):
06.05.2017 21:18
И, следовательно, теряется возможность исключать "корневые" элементы архива, не исключая все остальные, содержащие аналогичный текст в своём полном пути?
Нет.

$

$ mkdir test $ cd test $ mkdir data{,1,2} $ ls data data1 data2 $ mkdir data1/data $ tar -cf ../archive.tar . --exclude=./data $ tar -tf ../archive.tar ./ ./data2/ ./data1/ ./data1/data/ $

Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
lone_wolf
Сообщения: 204

Re: TAR: исключить одну из корневых папок архива

Сообщение lone_wolf »

Bizdelnick писал(а):
06.05.2017 20:27
Абсолютный путь /data в архиве может быть только в том случае, если Вы архивировали каталог /data (а не /home/mytar/data или ./data) или преобразовали путь с помощью опции --transform.

Не ну так путь /home/mytar/data тоже Абсолютный ибо он же идет от корня файловой системы.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17706
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: TAR: исключить одну из корневых папок архива

Сообщение Bizdelnick »

Речь не о том, абсолютный он или относительный, а о том, что каталога /data нет ни в файловой системе, ни в архиве, поэтому исключение ТС указывает неправильно.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
lone_wolf
Сообщения: 204

Re: TAR: исключить одну из корневых папок архива

Сообщение lone_wolf »

Bizdelnick писал(а):
07.05.2017 23:14
Речь не о том, абсолютный он или относительный, а о том, что каталога /data нет ни в файловой системе, ни в архиве, поэтому исключение ТС указывает неправильно.

По этому вопросу согласен.
Спасибо сказали:

Novascriptum
Сообщения: 40

Re: TAR: исключить одну из корневых папок архива

Сообщение Novascriptum »

Bizdelnick писал(а):
07.05.2017 00:24
Novascriptum писал(а):
06.05.2017 21:18
И, следовательно, теряется возможность исключать "корневые" элементы архива, не исключая все остальные, содержащие аналогичный текст в своём полном пути?
Нет.

$

$ mkdir test $ cd test $ mkdir data{,1,2} $ ls data data1 data2 $ mkdir data1/data $ tar -cf ../archive.tar . --exclude=./data $ tar -tf ../archive.tar ./ ./data2/ ./data1/ ./data1/data/ $




Ого, вот это тонкости. Сам бы в жизни умом не дошёл до такого. Большое спасибо, всё заработало! Вы просто волшебник.
Спасибо сказали:

Аватара пользователя
lone_wolf
Сообщения: 204

Re: TAR: исключить одну из корневых папок архива

Сообщение lone_wolf »

Перечитывая тему не могу сообразить а как быть если указан относительный каталог?
Ну вот допустим я хочу затарить содержимое каталога /home/user/data но без самого каталога /home/user/data.
И не могу сообразить как правильно указать это tar.
Так как плучается
tar -cvf /tmp/archive.tar /home/user/data/*
tar: Удаляется начальный `/' из имен объектов
/home/user/data/111
/home/user/data/222
/home/user/data/data1/
Что-то я туплю знатно :blush:
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17706
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: TAR: исключить одну из корневых папок архива

Сообщение Bizdelnick »

lone_wolf писал:
26.06.2020 18:50
затарить содержимое каталога /home/user/data но без самого каталога /home/user/data
tar -cv -C /home/user/data -f /tmp/archive.tar .
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: