Tar каталог, но не храните полные абсолютные пути в архиве

182

У меня есть следующая команда в части оболочки резервного копирования script:

tar -cjf site1.bz2 /var/www/site1/

Когда я перечисляю содержимое архива, я получаю:

tar -tf site1.bz2
var/www/site1/style.css
var/www/site1/index.html
var/www/site1/page2.html
var/www/site1/page3.html
var/www/site1/images/img1.png
var/www/site1/images/img2.png
var/www/site1/subdir/index.html

Но я хотел бы удалить часть /var/www/site1 из каталога и имен файлов в архиве, чтобы упростить извлечение и избежать бесполезной постоянной структуры каталогов. Никогда не знайте, если я извлечу резервные сайты в месте, где веб-данные не были сохранены в /var/www.

В приведенном выше примере я хотел бы:

tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html

Итак, когда я извлекаю файлы, файлы извлекаются в текущем каталоге, и мне не нужно впоследствии перемещать извлеченные файлы, и поэтому структуры подкаталогов сохраняются.

Есть много вопросов о tar и резервном копировании в stackoverflow и в других местах в Интернете, но большинство из них просят отбросить всю структуру подкаталогов (сгладить) или просто добавить или удалить начальную/имена (я не знаю, что именно изменяется при извлечении), но не более.

После ознакомления с некоторыми решениями, найденными здесь и там, а также с руководством, я попробовал:

tar -cjf site1.bz2 -C . /var/www/site1/
tar -cjf site1.bz2 -C / /var/www/site1/
tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/
tar -cjf site1.bz2 --strip-components=3 /var/www/site1/

Но никто из них не работал так, как я хочу. Некоторые ничего не делают, некоторые другие больше не архивируют подкаталоги.

Он находится в резервной оболочке script, запущенной Cron, поэтому я не очень хорошо знаю, какой пользователь запускает ее, каков путь и текущий каталог, поэтому всегда нужно писать абсолютный путь для всего, и предпочитаете не менять текущий каталог, чтобы не ломать что-то еще в script (потому что он не только создает резервные копии веб-сайтов, но и базы данных, а затем отправляет все это на FTP и т.д.)

Как это сделать?

Я просто неправильно понял, как работает опция -C?

Теги:
backup
tar

6 ответов

270
Лучший ответ
tar -cjf site1.tar.bz2 -C /var/www/site1 .

В приведенном выше примере tar будет изменен на каталог /var/www/site1, прежде чем делать это, потому что была предоставлена ​​опция -C /var/www/site1.

От man tar:

OTHER OPTIONS

  -C, --directory DIR
       change to directory DIR
  • 108
    Не пропустите точку в конце, это важно ;-)
  • 4
    Как насчет того, если вы также хотите выбрать файлы для резервного копирования на основе подстановочного знака? -C / var / www / site1 * .dat не работает :(
Показать ещё 9 комментариев
28

Работает опция -C; просто для уточнения Я отправлю 2 примера:

  • создание tarball без полного пути: полный путь /home/testuser/workspace/project/application.war, и мы хотим просто project/application.war так:

    tar -cvf output_filename.tar  -C /home/testuser/workspace project
    

    Примечание: между workspace и project имеется пробел; tar заменит полный путь только project.

  • извлечение tarball с изменением целевого пути (по умолчанию - ., т.е. текущий каталог)

    tar -xvf output_filename.tar -C /home/deploy/
    

    tar будет извлекать tarball на основе заданного пути и сохранять путь создания; в нашем примере файл application.war будет извлечен в /home/deploy/project/application.war.

    /home/deploy: данный на выдержке
    project: при создании tarball

Примечание. Если вы хотите поместить созданный tarball в целевой каталог, вы просто добавляете целевой путь перед именем tarball. например:

tar -cvf /path/to/place/output_filename.tar  -C /home/testuser/workspace project
  • 1
    Как добавить шаблон для выбора файла в последнем примере?
  • 0
    Проблема с подстановочными знаками заключается в том, что оболочка расширяет их до соответствующих имен файлов и что tar не раскрывает их, если они заключены в кавычки ...
5

Похоже, многие неправильно поняли параметр -C в tar.

tar target_path/file.tar.gz -C source_path/source_dir .

или

tar target_path/file.tar.gz -C source_path/source_dir

не удалит абсолютный префикс пути внутри файла tar.gz.

Простейшим решением является cd in в source_path (родительский каталог source_dir) и запускать

tar target_path/file.tar.gz source_dir

в script. Это приведет к удалению абсолютного префикса пути в вашей сгенерированной структуре каталога файлов tar.gz.

  • 0
    При использовании опции -C DID удаляются префиксы абсолютного пути внутри сгенерированного файла tar.gz в fedora 29. Ваш ответ специфичен для какой-либо системы?
  • 0
    @EL_DON: Я не тестировал опцию -C в Fedora, но в идеале программное обеспечение tar должно работать согласованно на всех платформах, если только это не ошибка в приложении tar. -C вариант, я тестировал на Mac 10.8 и Mac 10.13 и Ubuntu (версия, которую я не помню). Но начиная с tar v2.8.3, команда была изменена на tar -cf target_path / file.tar.gz source_dir, и все же, если вы добавите опцию -C, она не удалит префикс абсолютного пути внутри сгенерированного файла tar.gz.
Показать ещё 4 комментария
4

Следующая команда создаст корневой каталог "." и поместите в него все файлы из указанного каталога.

tar -cjf site1.tar.bz2 -C /var/www/site1 .

Если вы хотите поместить все файлы в корень из файла tar, @chinthaka прав. Просто введите cd в каталог и выполните:

tar -cjf target_path/file.tar.gz *

Это поместит все файлы в cwd в файл tar в виде файлов root.

  • 0
    Использование * не сохраняет никаких «скрытых» .files или .folders. (fyi, использование -C вместе с * завершается неудачей, оболочка расширяет текущий каталог, а не -C каталог)
0

Если вы хотите заархивировать подкаталог и обрезать путь к подкаталогу, эта команда будет полезна:

tar -cjf site1.bz2 -C /var/www/ site1
0

Использование "точки" приводит к созданию папки с именем "точка" (в Ubuntu 16).

tar -tf site1.bz2 -C /var/www/site1/ .

Я рассмотрел это более подробно и подготовил пример. Многострочная запись плюс исключение.

tar -tf site1.bz2\
    -C /var/www/site1/ style.css\
    -C /var/www/site1/ index.html\
    -C /var/www/site1/ page2.html\
    -C /var/www/site1/ page3.html\
    --exclude=images/*.zip\
    -C /var/www/site1/ images/
    -C /var/www/site1/ subdir/
/
  • 0
    Почему вы называете это «точка»? Это просто . , который является текущим каталогом. В контексте структуры tar.gz это просто базовый / корневой / верхний уровень, верно?
  • 0
    Смотрите снимок для деталей изображения . Мой способ правильнее использовать, это мое мнение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню