我正在使用此命令来备份一些重要的配置文件:
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
尝试删除 * (或者 /*)。
余数语法 ...
当文件是目录的路径名时,该操作适用于该目录的所有文件和(递归)子目录。
答案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
你像我以前一样犯了简单的错误:)
- -C tar 选项仅将 tar 命令“移动”到“/”。
- 首先是 shell。它使用当前目录扩展星号。当您编写 /etc/* 时,它将扩展 /etc/* 作为名称。当您编写 etc/* 时,它不是从 /root 开始,而是从当前目录开始。您可以通过添加 '/' 或 cd / 来修复此问题。这样就不需要 -C 了。
- 您可以使用符号“etc/*”来阻止 shell 进行扩展。但 tar 将“按原样”使用它。如果您不想这样,请使用 --wildcards 选项。
- 如果您使用‘etc/*’,您可以简单地使用‘etc/’。选项--recursion 是默认的。
请参阅 man tar 。但在较旧的系统中,此手册不完整,请使用 info tar 。