Использование подстановочных знаков с tar

1

Я использую эту команду для резервного копирования некоторых важных файлов конфигурации:

tar -czvf /var/backups/201102121202.tgz -C / etc/crontab etc/httpd/conf.d/* etc/httpd/conf/httpd.conf etc/httpd/passwords etc/httpd/vhost/* etc/php.ini etc/my.cnf etc/ssh/* etc/hosts etc/sysconfig/iptables var/spool/cron/* etc/passwd etc/group root/iptables_config etc/postfix/main.cf etc/postfix/master.cf etc/postfix/transport etc/postfix/valid_recipients etc/postfix/virtual etc/sysconfig/memcached etc/php.d/apc.ini etc/selinux/config etc/yum.repos.d/* etc/list_of_installed_packages.txt etc/safe-rm.conf home/*/.bash* home/*/.ssh usr/local/bin/* usr/local/sbin/* /etc/pki/tls/certs/mysite.com.crt /etc/pki/tls/private/mysite.key /etc/pki/tls/certs/gd_bundle.crt

Когда я запускаю его, я получаю:

tar: etc/httpd/conf.d/*: Cannot stat: No such file or directory
tar: etc/httpd/vhost/*: Cannot stat: No such file or directory
tar: etc/ssh/*: Cannot stat: No such file or directory
tar: var/spool/cron/*: Cannot stat: No such file or directory
tar: etc/yum.repos.d/*: Cannot stat: No such file or directory
tar: home/*/.bash*: Cannot stat: No such file or directory
tar: home/*/.ssh: Cannot stat: No such file or directory
tar: usr/local/bin/*: Cannot stat: No such file or directory
tar: usr/local/sbin/*: Cannot stat: No such file or directory
tar: Removing leading `/' from member names
tar: Error exit delayed from previous errors

Кажется, я не могу использовать подстановочные знаки в путях.
Как я могу это исправить или обойти это?

Спасибо,
Дэн

dan
источник
Какую оболочку вы используете?
Hello71
Я использую bash
dan

Ответы:

2

Вероятная проблема заключается в том, что вы не находитесь в корневом каталоге (/), но подстановочные знаки предполагают, что вы находитесь. Помните, что оболочка расширяет символы подстановки в командной строке перед вызовом программы. Таким образом, вы, etc / ssh / *, относитесь к вашему текущему рабочему каталогу, который, скорее всего, не существует. Бежать (cd /; tar ... etc/ssh/* ...) вместо.

Arcege
источник
1

Вы скучаете по / до начала имен. Оболочка будет отображать имена только в том случае, если они являются абсолютными путями. Кроме того, если вы делаете это, нет необходимости использовать -C,

Hello71
источник
Хорошая точка зрения. Я думаю, что сделал это по причине. Возможно, потому что, если я использую абсолютные пути, когда я распаковываю пакет, я рискую перезаписать каталог / etc хост-системы. Я ясно дал понять?
dan
1
оболочка выведет любое имя файла, относительное или абсолютное. И добавив / к путям привязывает их и заставляет перезаписывать при извлечении системных файлов и не позволяет распаковывать файлы, скажем, /tmp (не без использования chroot в любом случае).
Arcege
1
@Arcege: оболочка, однако, не будет волшебным образом выяснить, что -C причины tar сменить каталог.
Hello71
1
Вот почему альтернативы от -C один вариант должен быть сделан, как (cd /; tar czf ...) или же find /etc/httpd/conf.d /etc/ssh /home/*/.ssh ... -print | sed 's;^/;;' > /tmp/tar.lst && tar czfCI $tarfile / /tmp/tar.lst && rm /tmp/tar.lst, Но явно говорить, что «оболочка будет выводить имена, только если они являются абсолютными путями», неверно. Если бы это было правильно, то echo * или даже echo ./* не будет работать.
Arcege
1

Попробуйте сбросить * (или, возможно, / *).


Синтаксис остатка ...

Когда file является путем к каталогу, действие применяется ко всем файлам и (рекурсивно) подкаталогам этого каталога.

http://www.computerhope.com/unix/utar.htm

therube
источник
-1 для ссылки на computerhope, а не на man-страницу.
Hello71
0

ваша команда:

tar -czvf /var/backups/201102121202.tgz -C / etc/crontab etc/httpd/conf.d/* etc/httpd/conf/httpd.conf etc/httpd/passwords etc/httpd/vhost/* etc/php.ini etc/my.cnf etc/ssh/* etc/hosts etc/sysconfig/iptables var/spool/cron/* etc/passwd etc/group root/iptables_config etc/postfix/main.cf etc/postfix/master.cf etc/postfix/transport etc/postfix/valid_recipients etc/postfix/virtual etc/sysconfig/memcached etc/php.d/apc.ini etc/selinux/config etc/yum.repos.d/* etc/list_of_installed_packages.txt etc/safe-rm.conf home/*/.bash* home/*/.ssh usr/local/bin/* usr/local/sbin/* /etc/pki/tls/certs/mysite.com.crt /etc/pki/tls/private/mysite.key /etc/pki/tls/certs/gd_bundle.crt

Вы делаете простую ошибку, как я в прошлом :)

  1. -C tar опция 'перемещает' только команду tar в '/', как и вы.
  2. Сначала это оболочка. Это расширяет звездочки, используя текущий каталог. Когда вы пишете / etc / *, это расширение / etc / * для имен. Когда вы пишете etc / *, это начинается не с / root, а с текущего каталога. Вы можете исправить это добавление '/' или CD /. Тогда -С не нужен.
  3. Вы можете предотвратить расширение с помощью оболочки, используя обозначение 'etc / *'. Но tar будет использовать это «как есть». Если вы этого не хотите, используйте опцию --wildcards.
  4. Для чего вы используете «etc / *», вы можете просто использовать «etc /». Опция --recursion по умолчанию.

Смотри мужик смол. Но в старых системах это руководство неполное, поэтому используйте info tar.

Znik
источник