如果我使用此命令:
sudo tar -zcvpf exclusion.tar.gz mybkup/ --exclude=mybkup/etc/ssh/
然后如果我试着看看ssh目录是否包含在tarball内容中,我看到其实包含在内:
[user@smashingx1 ~]$ tar -tvzf exclusion.tar.gz | grep ssh
lrwxrwxrwx user/user 0 2016-11-30 04:26 mybkup/etc/systemd/system/multi-user.target.wants/sshd.service -> /usr/lib/systemd/system/sshd.service
-rw-r----- user/user 506 2016-11-30 04:26 mybkup/etc/sysconfig/sshd
-rw-r--r-- user/user 5996 2016-11-30 04:26 mybkup/etc/xdg/autostart/gnome-keyring-ssh.desktop
drwxr-xr-x user/user 0 2016-11-30 04:26 mybkup/etc/ssh/
-rw-r--r-- user/user 242153 2016-11-30 04:26 mybkup/etc/ssh/moduli
-rw-r--r-- user/user 2208 2016-11-30 04:26 mybkup/etc/ssh/ssh_config
-rw-r--r-- user/user 382 2016-11-30 04:26 mybkup/etc/ssh/ssh_host_rsa_key.pub
-rw-r--r-- user/user 162 2016-11-30 04:26 mybkup/etc/ssh/ssh_host_ecdsa_key.pub
-rw-r--r-- user/user 4760 2016-11-30 04:26 mybkup/etc/ssh/sshd_config
-rw-r--r-- user/user 82 2016-11-30 04:26 mybkup/etc/ssh/ssh_host_ed25519_key.pub
-rw-r----- user/user 1675 2016-11-30 04:26 mybkup/etc/ssh/ssh_host_rsa_key
-rw-r----- user/user 227 2016-11-30 04:26 mybkup/etc/ssh/ssh_host_ecdsa_key
-rw------- user/user 4361 2016-11-30 04:26 mybkup/etc/ssh/sshd_config.rpmnew
-rw-r----- user/user 387 2016-11-30 04:26 mybkup/etc/ssh/ssh_host_ed25519_key
-rw-r--r-- user/user 8730 2016-11-30 04:26 mybkup/etc/selinux/targeted/modules/active/modules/rssh.pp
-rw-r--r-- user/user 18774 2016-11-30 04:26 mybkup/etc/selinux/targeted/modules/active/modules/ssh.pp
-rw-r--r-- user/user 904 2016-11-30 04:26 mybkup/etc/pam.d/sshd
但如果我不在目录路径的末尾添加最后一个'/',它会排除目录:
sudo tar -zcvpf exclusion.tar.gz mybkup/ --exclude=mybkup/etc/ssh
tar -tvzf exclusion.tar.gz | grep ssh
lrwxrwxrwx user/user 0 2016-11-30 04:26 mybkup/etc/systemd/system/multi-user.target.wants/sshd.service -> /usr/lib/systemd/system/sshd.service
-rw-r----- user/user 506 2016-11-30 04:26 mybkup/etc/sysconfig/sshd
-rw-r--r-- user/user 5996 2016-11-30 04:26 mybkup/etc/xdg/autostart/gnome-keyring-ssh.desktop
-rw-r--r-- user/user 8730 2016-11-30 04:26 mybkup/etc/selinux/targeted/modules/active/modules/rssh.pp
-rw-r--r-- user/user 18774 2016-11-30 04:26 mybkup/etc/selinux/targeted/modules/active/modules/ssh.pp
-rw-r--r-- user/user 904 2016-11-30 04:26 mybkup/etc/pam.d/sshd
我很困惑,因为我认为通过指示tar排除目录,它会排除目录及其内容,但显然不是这样,有人可以解释一下吗?
答案 0 :(得分:1)
首先,快速提示。您可以更轻松地测试行为,而无需实际创建tar文件,如下所示:
tar c mybkup/ --exclude=mybkup/etc/ssh/ | tar t
我希望你能体会到它的美丽。
排除模式定义非常原始。
遗憾的是,man tar
并没有解释任何关于如何" PATTERN"应该写下以及如何解释它。
根据一些观察,我提出了以下推理。
在您的示例中,不排除mybkup/etc/ssh/
,因为它既不是文件也不是目录。虽然mybkup/etc/ssh
是目录,但mybkup/etc/ssh/
不是。换句话说,尾随/
不是目录名称的一部分,因此它不被视为目录,因此只是被忽略,而不是被排除。
我担心它的方式就是这样。这是一个原始特征。
Shell globs虽然好。例如,给定您的文件,如果您这样做:
tar c mybkup --exclude='mybkup/etc/sy*' | tar t
它将排除mybkup/etc/systemd
和mybkup/etc/sysconfig
目录及其内容。 (请注意,引用mybkup/etc/sy*
非常重要,以便tar
解释*
而不是shell。)
答案 1 :(得分:0)
- exclude = PATTERN
排除文件,以PATTERN格式提供
当你使用--exclude = mybackup / etc / ssh / tar时,没有得到任何完全匹配的模式。当你使用--exclude = mybackup / etc / ssh tar时,得到模式的完全匹配。