tar打包当前目录时要用.而不是*

使用.打包时,当前目录下的项目是作为目录.的子项目由tar遍历的,会包含当前目录下所有以.开头的隐藏项目

使用*打包时,当前目录下的项目是由bash等shell的通配符展开行为遍历的,不会包含当前目录下所有以.开头的隐藏项目

以下命令会打包当前目录下所有非隐藏项目,不会包含当前目录下所有以.开头的隐藏项目:

tar cvzf /home/backup.tar.gz *

以下命令会打包当前目录下所有目录/文件,包括当前目录下所有以.开头的隐藏目录/文件:

tar cvzf /home/backup.tar.gz .

另一个做法是显式让bash等shell展开当前目录所有以.开头的隐藏项目:

tar cvzf /home/backup.tar.gz .[!.]* ..?* *

注意这里要用.[!.]*(或者.[^.]*)匹配只以一个点开头且两个以上字符的项目,用..?*匹配以两个以上点开头且3个以上字符的项目(如果没有这样的项目可以省略),而不能直接用.*,因为这样会包含.和..,.会导致文件重复打包生成冗余硬链接,而..会导致上层目录的项目被打包放进同级目录

08-28 12:22