Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС для молодых и начинающих системных администраторов.
А хотел опцией --exclude исключить корневую папку /data.
Если же написать --exclude="data", то пропадает и корневая папка архива /data, и /home/mytar/data. Как правильно написать, чтобы была исключена только корневая папка /data? Никак не выходит.
А зачем Вы явно просите заархивировать каталог data, если он Вам не нужен?
Затем, что я хочу разобраться, как работает exclude. До сих пор никаким способом не получается исключить корневой элемент архива. Либо без указания ведущего "/", либо никак. А если ведущий "/" не указывать, то попутно исключаются и все вложенные пути, подходящие под шаблон. Неужели это внутреннее ограничение самого TAR? Проверяю на версии 1.26.
А зачем Вы явно просите заархивировать каталог data, если он Вам не нужен?
Затем, что я хочу разобраться, как работает exclude. До сих пор никаким способом не получается исключить корневой элемент архива. Либо без указания ведущего "/", либо никак. А если ведущий "/" не указывать, то попутно исключаются и все вложенные пути, подходящие под шаблон. Неужели это внутреннее ограничение самого TAR? Проверяю на версии 1.26.
Сказал бы я, чьё это ограничение...
Вы же сами заказали взаимно исключающее: явно затребовали архивирование пути, который собрались исключать. Ну, проверили, у кого приоритет.
Сказал бы я, чьё это ограничение...
Вы же сами заказали взаимно исключающее: явно затребовали архивирование пути, который собрались исключать. Ну, проверили, у кого приоритет.
Не согласен, если я явно указываю папку data, а в exclude - что нужно исключить /data/.hidden (конкретный файл) - не работает. Это тоже так задумано? Зачем вообще тогда нужен exclude?
tar -cf - /home/mytar/data /home/mytar/data2 --exclude=/home/mytar/data > data.tar
То есть папка "data" в архиве отсутствует, а "data2" - присутствует. Но! Если я хочу указать не полный, а относительный путь до папки data, то exclude не получается задать никак.
если я явно указываю папку data, а в exclude - что нужно исключить /data/.hidden (конкретный файл) - не работает
А почему Вы указываете путь от корня? Смотрите, какие пути внутри архива (tar -tf data.tar) и указывайте, как там.
Так я же оба варианта проверил. Что от корня файловой системы, что от корня архива - не работает. Если используются при добавлении абсолютные пути файлов - всё хорошо. Если относительные (включая параметр "-C") - не работает. А использование только абсолютных путей (без -C) сильно ограничивает функциональность.
Что от корня файловой системы, что от корня архива - не работает.
У tar-архива нет корня. В нём хранятся файлы и пути к ним. Пути могут быть абсолютные или относительные в зависимости от того, как создавали архив. Абсолютный путь /data в архиве может быть только в том случае, если Вы архивировали каталог /data (а не /home/mytar/data или ./data) или преобразовали путь с помощью опции --transform.
Что от корня файловой системы, что от корня архива - не работает.
У tar-архива нет корня. В нём хранятся файлы и пути к ним. Пути могут быть абсолютные или относительные в зависимости от того, как создавали архив. Абсолютный путь /data в архиве может быть только в том случае, если Вы архивировали каталог /data (а не /home/mytar/data или ./data) или преобразовали путь с помощью опции --transform.
Я правильно понимаю, что из этого непременно следует, что если пути в архиве без ведущего "/" (а именно так происходит при использовании относительных путей при добавлении элементов в архив), то бесполезно в --exclude писать правило с ведущего "/"? И, следовательно, теряется возможность исключать "корневые" элементы архива, не исключая все остальные, содержащие аналогичный текст в своём полном пути?
Я правильно понимаю, что из этого непременно следует, что если пути в архиве без ведущего "/" (а именно так происходит при использовании относительных путей при добавлении элементов в архив), то бесполезно в --exclude писать правило с ведущего "/"?
И, следовательно, теряется возможность исключать "корневые" элементы архива, не исключая все остальные, содержащие аналогичный текст в своём полном пути?
Нет.
$
$ 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/
$
Абсолютный путь /data в архиве может быть только в том случае, если Вы архивировали каталог /data (а не /home/mytar/data или ./data) или преобразовали путь с помощью опции --transform.
Не ну так путь /home/mytar/data тоже Абсолютный ибо он же идет от корня файловой системы.
Речь не о том, абсолютный он или относительный, а о том, что каталога /data нет ни в файловой системе, ни в архиве, поэтому исключение ТС указывает неправильно.
Речь не о том, абсолютный он или относительный, а о том, что каталога /data нет ни в файловой системе, ни в архиве, поэтому исключение ТС указывает неправильно.
И, следовательно, теряется возможность исключать "корневые" элементы архива, не исключая все остальные, содержащие аналогичный текст в своём полном пути?
Нет.
$
$ 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/
$
Ого, вот это тонкости. Сам бы в жизни умом не дошёл до такого. Большое спасибо, всё заработало! Вы просто волшебник.
Перечитывая тему не могу сообразить а как быть если указан относительный каталог?
Ну вот допустим я хочу затарить содержимое каталога /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/