在 tar 中使用通配符

在 tar 中使用通配符

我正在使用此命令来备份一些重要的配置文件:

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

似乎我不能在路径中使用通配符。
我该如何修复或解决这个问题?

谢谢,

答案1

可能的问题在于您不在根目录 (/) 中,但通配符会假定您在。请记住,shell 在调用程序之前会在命令行上扩展通配符。因此,etc/ssh/* 与您当前的工作目录相关,而该目录可能不存在。请(cd /; tar ... etc/ssh/* ...)改为运行。

答案2

您在名称开头之前缺少/。如果名称是绝对路径,则 shell 只会将其通配。另外,如果您这样做,则无需使用-C

答案3

尝试删除 * (或者 /*)。


余数语法 ...

当文件是目录的路径名时,该操作适用于该目录的所有文件和(递归)子目录。

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

答案4

你的命令:

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. 首先是 shell。它使用当前目录扩展星号。当您编写 /etc/* 时,它将扩展 /etc/* 作为名称。当您编写 etc/* 时,它不是从 /root 开始,而是从当前目录开始。您可以通过添加 '/' 或 cd / 来修复此问题。这样就不需要 -C 了。
  3. 您可以使用符号“etc/*”来阻止 shell 进行扩展。但 tar 将“按原样”使用它。如果您不想这样,请使用 --wildcards 选项。
  4. 如果您使用‘etc/*’,您可以简单地使用‘etc/’。选项--recursion 是默认的。

请参阅 man tar 。但在较旧的系统中,此手册不完整,请使用 info tar 。

相关内容