tar: удаление начального `/ 'из имен членов


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

Как я могу решить эту проблему и сохранить /имена файлов?


2
Что именно не работает, как ожидалось?

34
Это не проблема. Вам не нужны начальные слэши в архиве tar. Шутки в сторону. Если вы хотите извлечь архив в корневой каталог вашей системы, укажите его -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. Я исправил эту проблему, используя мою собственную версию решения @ Marcus:cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
rubynorails

1
Я думаю, что есть некоторые варианты использования -P- например, если вы предоставляете какую-то функцию создания снимков файловой системы в FUSE. Иногда вам может потребоваться распечатать снимок в определенном каталоге, а не cwdс точки зрения пользователя.
DIMMSum

81

Если вы хотите избавиться от «Удаление начального` / 'из имен элементов », печатаемого в STDERR, но все же хотите исключить эти начальные косые черты, как это делает tar по умолчанию, я нашел здесь отличное решение от commenter timsoft.

Решение заключается в использовании опции -C, чтобы изменить каталог на корень (/), а затем указать дерево файлов для архивирования без косой черты, поскольку теперь вам нужен только относительный путь. Это делает то же самое, что и обычная команда tar create, но удаление не требуется:

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

Это не будет работать с инкрементными резервными копиями. Но хороший ответ.
Гайдипайти

Это также не работает, если вы хотите заархивировать файлы, обозначенные расширением оболочки (например tar c -C / home/foo/*), потому что оболочка не знает об измененном корне. Но все же хороший ответ для других случаев.
Борис

1
-C /не работает для меня, точка. Это не мешает stderr для меня.
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

Спасибо за помощь. Это то, что мне было нужно. Мне не нужен был полный путь в моем архиве, только папка назначения.
Кристия

Думаю, это следовало бы принять за правильный ответ.
Младен Б.

Я не вижу, как это отвечает на вопрос вообще. Это что-то другое, что можно сделать. ……… Как: Q: Как мне добраться из Лос-Анджелеса в Нью-Йорк? 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 в bash-скрипте, он не вернет 0 в случае успеха.
Брайан

@staticx, код ошибки равен 0 независимо.
Acumenus

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

1
@ Брайан, вы можете использовать $ 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 .

таким образом, вы не пытаетесь поместить абсолютные пути в архив tar. Если вы хотите распаковать его в корень файловой системы, вы просто

cd / && tar xzf backupt.tar.gz после передачи.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.