tar
对一个名为 mydir
的目录进行归档时,会将隐藏文件和子目录也归档,但是在 mydir
目录内使用 *
通配符的 tar
命令则不会。这是已知的不一致性或缺陷吗?
编辑:额外信息。在 mydir
目录内使用带有 *
通配符的 tar
命令不会“看到”并归档该目录中立即级别下的隐藏文件和子目录。然而,在 mydir
目录的非隐藏子目录中,隐藏文件和子目录将被归档。换句话说,深入目录树中的隐藏对象将被归档。
tar
对一个名为 mydir
的目录进行归档时,会将隐藏文件和子目录也归档,但是在 mydir
目录内使用 *
通配符的 tar
命令则不会。这是已知的不一致性或缺陷吗?
编辑:额外信息。在 mydir
目录内使用带有 *
通配符的 tar
命令不会“看到”并归档该目录中立即级别下的隐藏文件和子目录。然而,在 mydir
目录的非隐藏子目录中,隐藏文件和子目录将被归档。换句话说,深入目录树中的隐藏对象将被归档。
使用通配符将无法正常工作。如果您要指定包括隐藏文件在内的完整目录,则必须指定“。”(当前目录)。您可以执行以下操作:
tar -cvpzf test.tgz .
*
由shell处理,不会扩展到以点开头的内容。另一个通配符?
也不会扩展到以点开头的内容。感谢Keith指出这是由shell进行扩展,因此与tar
无关。shopt -s dotglob
,则扩展将包括像.filename
这样的内容。感谢Andy。shopt -u dotglob
关闭它。dotglob
选项不会改变ls
本身。而只是更改类似于ls *
中所示的扩展行为。shopt -s dotglob
,你可以轻松地在想要打包的目录内执行 tar -cvpzf final.tar.gz *
。 - Rod Elias您可以使用:
tar -cvpzf test.tgz * .??*
但是,这仅适用于名称>2的隐藏文件(以防止'.'和'..')
tar -zcvf compressed.tgz `ls -A -1`
ls -A -1
,那么你传递的是当前目录下除了.
和..
以外的所有文件夹。
对于子目录来说,.hidden文件默认已经包含在压缩中。Shell会展开通配符,因此tar甚至不会看到它们。如果您想这样做,必须明确添加它们(.*
)。但是,最常见的方法是将单个目录打包,以便在解压缩时所有内容都放在同一个位置。
.[a-zA-Z]*
这样的东西会更安全。但是,我总是更喜欢只打包一个目录(如果需要的话就是父目录)。 - Keithshopt -s dotglob
这将使得
这将打包所有隐藏的文件和目录
tar -cvzf hidden.tgz `ls -a | egrep [.][^.]+`
tar czpf /var/tmp/mytar.tgz .
。 - Keithtar cvpfz test.tgz --exclude=*.tgz .
,因为它解决了不想打包新 tar 文件的问题,但我不建议这样做。我认为最好从外部调用 tar(即从父目录),这样你可以明确命名要打包的目录并避免使用.
(点)。这样做的好处是明确且避免需要使用--exclude
选项。 - H2ONaCl