У меня есть следующая команда в части оболочки резервного копирования 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?
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
Работает опция -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
Похоже, многие неправильно поняли параметр -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.
Следующая команда создаст корневой каталог "." и поместите в него все файлы из указанного каталога.
tar -cjf site1.tar.bz2 -C /var/www/site1 .
Если вы хотите поместить все файлы в корень из файла tar, @chinthaka прав. Просто введите cd в каталог и выполните:
tar -cjf target_path/file.tar.gz *
Это поместит все файлы в cwd в файл tar в виде файлов root.
Если вы хотите заархивировать подкаталог и обрезать путь к подкаталогу, эта команда будет полезна:
tar -cjf site1.bz2 -C /var/www/ site1
Использование "точки" приводит к созданию папки с именем "точка" (в 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/
/
.
, который является текущим каталогом. В контексте структуры tar.gz
это просто базовый / корневой / верхний уровень, верно?