tar: видалення провідних `/ 'з імен членів


137
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names

Як я можу вирішити цю проблему та зберегти /імена файлів?


2
Що саме не працює, як очікувалося?

34
Це не проблема. Ви не хочете провідної косої риси в архіві дьогтю. Серйозно. Якщо ви хочете витягнути архів у ваш системний корінь, вкажіть -C /при його вилученні.
ThiefMaster

Відповіді:


69

Використовуйте --absolute-namesабо -Pпараметр, щоб вимкнути цю функцію.

tar fczP bkup.tar.gz /home/foo/

tar fcz bkup.tar.gz --absolute-names /home/foo

54
Це правильна відповідь, але пам’ятайте, що в більшості випадків це не те, що ви хочете , тому що це призводить до архіву, який витягується повними шляхами!
rubo77

8
Використання -C /параметра, описаного у відповіді @Marcus, позбудеться повідомлення STDERR, якщо це ваша основна мета.
Метт Сандерс

1
Як коментує @ rubo77, зазвичай це не очікуваний результат команди.
alfredocambera

3
Здебільшого це не те, що користувач хоче, просто тому, що більшість з них не читають посібник, поки їм це не потрібно (а для цього ніхто не має часу). Отже, було б розумно, принаймні, розширити свою відповідь, попереджаючи людей цього не робити, якщо вони абсолютно не впевнені, що вони розуміють, який ефект від цього. Особливо приймається як відповідь.
Младен Б.

1
@Toskan Приклади додано
Barmar

89

Це насправді особливість, а не проблема. Архів з абсолютним розташуванням становить загрозу безпеці. Зловмисники можуть використовувати такі архіви, щоб обманути користувачів встановити файли у критичних системних місцях.

Так, ви можете використовувати -P. Але що поганого в тому, щоб дозволити tar видалити просунуту косу рису і просто вимагати від користувача архіву явно робити вилучення в кореневому каталозі? Тоді вони свідомо впливають на критичні локації системи, і не можуть це зробити випадково.


5
Іноді функції є проблемами. Я знайшов цю нитку після створення резервної копії сценарію , який буде по електронній пошті про стан ненульового виходу з 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]
вирішив

1
Я думаю, що є деякі випадки використання -P- наприклад, якщо ви надаєте якусь функцію знімка файлової системи в FUSE. Час від часу, можливо, ви захочете знімати знімок у певному каталозі, а не cwdз точки зору користувача.
DIMMSum

81

Якщо ви хочете , щоб позбутися від «Вилучення ведущего` /» з імен »друкуються в STDERR, але все - таки хочуть залишити від цього провідного слеша , як дьоготь мудро робить за замовчуванням, я побачив відмінне рішення тут на коментатор timsoft.

Рішення передбачає використання опції -C для зміни каталогу в root (/), а потім визначення дерева файлів для архівації без ведучого косого риса, тому що зараз вам потрібен лише відносний шлях. Це робить те саме, що і звичайна команда створення tar, але зачистка не потрібна:

tar fcz bkup.tar.gz -C / home/foo/

Він не працюватиме з покроковими резервними копіями. Але хороша відповідь.
gajdipajti

Він також не працює, якщо потрібно націлити файли, позначені розширенням оболонки (наприклад tar c -C / home/foo/*), оскільки оболонка не знає про змінений корінь. Але все ж хороша відповідь для інших випадків.
Борис

1
-C /не працює для мене, період. Це не заважає мені бути більш жорстким.
Acumenus

3
@ABB переконайтесь, що шлях, наступний за -C /, є відносним.
zurfyx

Чи буде такий підхід спрацьовувати, якщо користувач не має дозволів у кореневій директорії?
Младен Б.

31

На місяць пізніше, але я знайшов найбільш підходяще рішення для мого випадку (у сценарії оболонки) - це перейти до батьківського каталогу та виконати команду там.

cd /var/www/
tar -czf mysite.gz mysite

Замість:

tar -czf /var/www/mysite.gz /var/www/mysite

9
Дійсно, ви могли це зробити за допомогою: tar -zcvf mysite.gz -C / var / www / mysite / Перевага цього полягає в тому, що ви можете виконати його з будь-якого каталогу
alfredocambera

Дякую за твою допомогу. Це те, що мені було потрібно. Я не хотів, щоб у моєму тарботі був повний шлях, лише папка призначення.
Крістен

Мабуть, це, мабуть, було б прийнято як правильну відповідь.
Младен Б.

Я не бачу, як це відповідає на питання взагалі. Це щось інше, що можна зробити. ……… Як: Питання: Як доїхати з Лос-Анджелеса до Нью-Йорка? A: Замість цього їдьте до Сан-Франциско.
G-Man

Я згоден з @ G-Man. У результаті вийде файл tar з абсолютно іншою структурою каталогу. У деяких випадках ця структура каталогів насамперед є більш доречною, але вона не відповідає на питання.
Кевін Кін

7

Це, як я зробив це за допомогою грубої сили методу: 2>&1 | grep -v "Removing leading".

Наприклад:

tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v  "Removing leading"

4
Проблема в цьому полягає в тому, що він приховує код помилки. Тож якщо ви хочете перевірити код помилки від tar в баш-скрипті, він не поверне 0 на успіх.
Брайан

@staticx, код помилки 0 незалежно.
Acumenus

1
@ABB Моя tarкоманда може повернутися 2до фатальної помилки.
Jite

1
@Brian ви можете використовувати $ PIPESTATUS, щоб отримати вихідний код. Див unix.stackexchange.com/questions/14270 / ...
simpleuser

3

Спробуйте використовувати -Cлише для шляху, який би перешкоджав стисканню повних контурів:

root@server # tar fcz bkup.tar.gz -C /home/ foo/

2

Я вирішив цю проблему за допомогою:

cd /home/foo && tar czf ~/backup.tar.gz .

таким чином ви не намагаєтесь в першу чергу поставити абсолютні шляхи до архіву смоли. Якщо ви хочете, щоб він просто знімав його в корені файлової системи

cd / && tar xzf backupt.tar.gz після його передачі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.