У меня есть следующая команда в части резервного сценария оболочки:
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/
Но никто из них не работал так, как я хочу. Некоторые ничего не делают, другие больше не архивируют подкаталоги.
Он находится внутри скрипта резервного копирования, запущенного Cron, поэтому я не знаю, какой пользователь его запускает, каков путь и текущий каталог, поэтому для всех требуется всегда писать абсолютный путь, и я бы предпочел не менять текущий каталог чтобы не допустить дальнейших ошибок в скрипте (поскольку он не только создает резервные копии веб-сайтов, но и баз данных, а затем отправляет все это на FTP и т. д.)
Как этого добиться?
Я просто неправильно понял, как работает опция -C?
-C
просто означает «изменить каталог», в то время как замена пути (или префикса) может быть только сделана--transform
. РИФ. superuser.com/questions/595510/prepend-prefix-in-tar/595512 вы можете просто -C (изменить каталог) и --transform его: `` `tar cjf site1.bz2 --transform" s / ^ \. \ // $ targetbase / "-C / var / www / site1. `` `Ответы:
В приведенном выше примере tar изменится на каталог,
/var/www/site1
прежде чем делать свое дело, потому что-C /var/www/site1
была задана опция .От
man tar
:источник
tar
архивировать все в текущем каталоге. И-C
устанавливает текущий каталог.tar -czvf site1.tar.gz -C /var/www/ site1
(Обратите внимание на пробел, я все еще использую -C, для перехода к родительскому каталогу и указания каталога для tar вместо точки)./folders
как это можно удалить?Опция
-C
работает; просто для пояснения выложу 2 примера:создание тарбола без полного пути: полный путь
/home/testuser/workspace/project/application.war
и то, что мы хотим, это простоproject/application.war
так:Примечание: между
workspace
и есть пробелproject
; tar заменит полный путь на justproject
.извлечение архива с изменением целевого пути (по умолчанию
.
, т.е. текущий каталог)tar
будет извлекать tarball на основе заданного пути и сохраняя путь создания; в нашем примере файлapplication.war
будет извлечен в/home/deploy/project/application.war
./home/deploy
: дано на выпискеproject
: дано на создание тарболаПримечание: если вы хотите поместить созданный тарбол в целевой каталог, вы просто добавляете целевой путь перед именем тарбола. например:
источник
Кажется,
-C
опция upto tar v2.8.3 не работает согласованно на всех платформах (ОС).-C
Говорят, что опция добавляет каталог в архив, но в Mac и Ubuntu она добавляет префикс абсолютного пути в сгенерированный файл tar.gz.Поэтому последовательное и надежное решение заключается
cd
в том, чтобы войти в source_path (родительский каталог source_dir) и запуститьили
в вашем сценарии. Это удалит префикс абсолютного пути в структуре вашего сгенерированного файла tar.gz.
источник
-cvf
добавлением послеtar
) я обнаружил, что в результирующем файле tar.gz нет абсолютных путей внутри него, что согласуется с некоторыми другими ответами. Если вы считаете, что tar неисправен или устарел в обеих системах, которые я использовал для тестирования, пожалуйста, дайте ссылку на некоторую документацию, которая поддержит ваш ответ. Я думаю, что-C
опция меняет каталог перед выполнением (как в других ответах). Когда я его опускаю, tar пытается добавить нежелательную почту./
, включая пути, начиная с./
.cd
первое. Ваш ответ говорит, что инструмент работает противоположно тому, как документы говорят, что он работает, и как он работает в моей системе, так что это неправильный ответ. Вы можете легко это исправить.Следующая команда создаст корневой каталог "." и поместите в него все файлы из указанного каталога.
Если вы хотите поместить все файлы в корень файла tar, @chinthaka прав. Просто перейдите в каталог и выполните:
Это поместит все файлы в cwd в файл tar как корневые файлы.
источник
Использование «точки» приводит к созданию папки с именем «точка» (в Ubuntu 16).
Я рассмотрел это более подробно и подготовил пример. Многострочная запись плюс исключение.
источник
.
текущий каталог. В контексте структурыtar.gz
's' это просто базовый / корневой / верхний уровень, верно?Если вы хотите заархивировать подкаталог и обрезать путь к подкаталогу, эта команда будет полезна:
источник