У частині сценарію оболонки резервної копії в мене є така команда:
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 (змінити каталог) і --перетворити його: `` `tar cjf site1.bz2 --transform" s / ^ \. \ // $ targetbase / "-C / var / www / site1. `` `