如果我在路径的末尾添加'/',则tar --exclude标志不排除目录

时间:2016-11-30 05:38:22

标签: linux bash tar

如果我使用此命令:

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排除目录,它会排除目录及其内容,但显然不是这样,有人可以解释一下吗?

2 个答案:

答案 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/systemdmybkup/etc/sysconfig目录及其内容。 (请注意,引用mybkup/etc/sy*非常重要,以便tar解释*而不是shell。)

答案 1 :(得分:0)

- exclude = PATTERN

排除文件,以PATTERN格式提供

当你使用--exclude = mybackup / etc / ssh / tar时,没有得到任何完全匹配的模式。当你使用--exclude = mybackup / etc / ssh tar时,得到模式的完全匹配。

相关问题