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. Я исправил эту проблему, используя мою собственную версию решения @ Marcus: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, но все же хотите исключить эти начальные косые черты, как это делает tar по умолчанию, я нашел здесь отличное решение от commenter timsoft.
Решение заключается в использовании опции -C, чтобы изменить каталог на корень (/), а затем указать дерево файлов для архивирования без косой черты, поскольку теперь вам нужен только относительный путь. Это делает то же самое, что и обычная команда tar create, но удаление не требуется:
tar fcz bkup.tar.gz -C / home/foo/
tar c -C / home/foo/*
), потому что оболочка не знает об измененном корне. Но все же хороший ответ для других случаев.
-C /
не работает для меня, точка. Это не мешает stderr для меня.
На месяц позже, но я нашел наиболее подходящее решение для моего случая (в сценарии оболочки) - перейти в родительский каталог и выполнить там команду.
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
при фатальной ошибке.