场景:有时打包压缩目录,想要排除忽略某些子文件和子目录,避免一些文件多体积大的不重要文件目录占用长期备份空间,且可以减少压缩工时。
# 举例目录:
tmp #想要打包的目录
├─ aaa #目录
├─ bbb #目录
├─ ccc.txt #文件
└─ ddd.txt #文件
# 7z排除/忽略指定目录和文件的命令示范:
7z a -t7z tmp.7z ./tmp '-xr!aaa/' '-xr!ccc.txt'
#压缩包里的内容成功排除了aaa目录和ccc.txt文件,只剩下bbb目录和ddd.txt文件:
tmp.7z
├─ bbb
└─ ddd.txt
# 7z参数解释
tmp.7z 是压缩包的文件名
./tmp 是想要压缩的目录
a 代表添加文件/文件夹到压缩包
-t 是指定压缩类型 一般我们定为7z
-xr! 是排除文件夹和文件,*注意:'!'感叹号在Linux中是系统特殊事件符号,在Shell命令中使用时需加''单引号转义成普通字符串。
# 7z路径规则:
路径规则:7z语法中的路径规则,是以压缩目标为根目录,比如“7z a tmp.7z ./tmp”中,“tmp/”就是7z语法中所有路径的最顶层,因此使用主机绝对路径就不能正确匹配,“tmp/aaa/”在主机中的绝对路径是“root/tmp/aaa/”,如果在7z语法中是使用“root/tmp/aaa/”,7z程序里实际解读的是“tmp/root/tmp/aaa/”。
举例:我们要压缩tmp/目录和排除tmp/下的aaa/目录:
7z a -t7z tmp.7z ./tmp '-xr!aaa' '-xr!ccc.txt' #√ aaa有效
7z a -t7z tmp.7z ./tmp '-xr!aaa/' '-xr!ccc.txt' #√ aaa/有效
7z a -t7z tmp.7z ./tmp '-xr!/aaa/' '-xr!ccc.txt' #× 不匹配 /aaa/二次运行会提示内部文件名冲突
7z a -t7z tmp.7z ./tmp '-xr!/aaa' '-xr!ccc.txt' #×不匹配 /aaa二次运行会提示内部文件名冲突
7z a -t7z tmp.7z ./tmp '-xr!*tmp/aaa' '-xr!ccc.txt' #√ *tmp/aaa通配符有效
7z a -t7z tmp.7z ./tmp '-xr!*tmp/aaa/' '-xr!ccc.txt' #√ *tmp/aaa/通配符有效
7z a -t7z tmp.7z ./tmp '-xr!./aaa/' '-xr!ccc.txt' #√ ./aaa/相对路径语法有效
7z a -t7z tmp.7z ./tmp '-xr!tmp/aaa/' '-xr!ccc.txt' #√ 以tmp作为根目录的绝对路径语法有效
7z a -t7z tmp.7z ./tmp '-xr!/tmp/aaa' '-xr!ccc.txt' #× 不匹配 /tmp/aaa不应超出tmp/根目录
7z a -t7z tmp.7z ./tmp '-xr!./tmp/aaa/' '-xr!ccc.txt' #× 不匹配 ./tmp/aaa/不应超出tmp/根目录
7z a -t7z tmp.7z ./tmp '-xr!/root/tmp/aaa/' '-xr!ccc.txt' #× /root/tmp/aaa主机绝对路径被7z解读成以tmp为根目录的路径因而匹配失败