root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names
Як я можу вирішити цю проблему та зберегти /
імена файлів?
-C /
при його вилученні.
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names
Як я можу вирішити цю проблему та зберегти /
імена файлів?
-C /
при його вилученні.
Відповіді:
Використовуйте --absolute-names
або -P
параметр, щоб вимкнути цю функцію.
tar fczP bkup.tar.gz /home/foo/
tar fcz bkup.tar.gz --absolute-names /home/foo
-C /
параметра, описаного у відповіді @Marcus, позбудеться повідомлення STDERR, якщо це ваша основна мета.
Це насправді особливість, а не проблема. Архів з абсолютним розташуванням становить загрозу безпеці. Зловмисники можуть використовувати такі архіви, щоб обманути користувачів встановити файли у критичних системних місцях.
Так, ви можете використовувати -P
. Але що поганого в тому, щоб дозволити tar видалити просунуту косу рису і просто вимагати від користувача архіву явно робити вилучення в кореневому каталозі? Тоді вони свідомо впливають на критичні локації системи, і не можуть це зробити випадково.
tar
. Це конкретне повідомлення змусило tar
вийти зі статусом 1
, який змусив мене отримувати помилкові сповіщення електронною поштою про успішні резервні копії, просто тому, що tar
писав це повідомлення в STDERR. Я cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
-P
- наприклад, якщо ви надаєте якусь функцію знімка файлової системи в FUSE. Час від часу, можливо, ви захочете знімати знімок у певному каталозі, а не cwd
з точки зору користувача.
Якщо ви хочете , щоб позбутися від «Вилучення ведущего` /» з імен »друкуються в STDERR, але все - таки хочуть залишити від цього провідного слеша , як дьоготь мудро робить за замовчуванням, я побачив відмінне рішення тут на коментатор timsoft.
Рішення передбачає використання опції -C для зміни каталогу в root (/), а потім визначення дерева файлів для архівації без ведучого косого риса, тому що зараз вам потрібен лише відносний шлях. Це робить те саме, що і звичайна команда створення tar, але зачистка не потрібна:
tar fcz bkup.tar.gz -C / home/foo/
tar c -C / home/foo/*
), оскільки оболонка не знає про змінений корінь. Але все ж хороша відповідь для інших випадків.
-C /
не працює для мене, період. Це не заважає мені бути більш жорстким.
На місяць пізніше, але я знайшов найбільш підходяще рішення для мого випадку (у сценарії оболонки) - це перейти до батьківського каталогу та виконати команду там.
cd /var/www/
tar -czf mysite.gz mysite
Замість:
tar -czf /var/www/mysite.gz /var/www/mysite
Це, як я зробив це за допомогою грубої сили методу: 2>&1 | grep -v "Removing leading"
.
Наприклад:
tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v "Removing leading"
tar
команда може повернутися 2
до фатальної помилки.
Я вирішив цю проблему за допомогою:
cd /home/foo && tar czf ~/backup.tar.gz .
таким чином ви не намагаєтесь в першу чергу поставити абсолютні шляхи до архіву смоли. Якщо ви хочете, щоб він просто знімав його в корені файлової системи
cd / && tar xzf backupt.tar.gz
після його передачі.