折腾服务器那阵子,每天都要处理大量零散的日志文件和安装包,那段时间最头疼的就是linux怎么压缩文件,一开始胡乱敲命令,要么压缩失败直接报错,要么压缩后的文件体积没变化,白白浪费不少操作时间。
最开始压根分不清tar、zip、gz这几个格式的区别,单纯以为随便一条压缩命令就能搞定所有文件。当时为了打包项目文件夹,直接照搬网上一条模糊的指令,直接输入`gz test ./project`,终端直接跳出一大串报错代码,屏幕上密密麻麻的英文提示,看的人心里烦躁。后面才反应过来,gz格式只能压缩单独文件,没办法直接打包整个文件夹,这也是新手最容易犯的低级错误。
单纯的文件压缩,其实用gzip命令就足够简便。随便找一个占用内存偏大的单独日志文件,输入`gzip 文件名`就行。要顺带提一嘴,这个命令有个很别扭的特性,执行之后原始文件会直接消失,系统只会留存压缩后的gz文件。之前没摸清这个特性,压缩完重要配置文件后原文件直接没了,慌慌张张回溯操作,折腾十几分钟才找回原始数据。
想同时保留原文件的话,就得换种写法。在命令末尾加上参数 -c,再定向输出新的压缩文件,完整指令就是`gzip -c 原始文件名 > 压缩后文件名.gz`。操作逻辑直白,就是将文件压缩后的内容,单独存为新文件,从根源上规避原文件被覆盖、删除的问题。
很多时候我们需要打包的不是单个文件,而是一整个文件夹,这种场景下tar命令才是最优解,也是我日常使用频率最高的指令。
(补充一句,linux系统里打包和压缩本身是两个独立操作,tar负责整合文件,gz负责缩小体积,多数人都会把二者混为一谈。)
日常打包压缩文件夹,固定用`tar -zcvf 压缩包名称.tar.gz 需要压缩的文件夹`这条指令就够了。参数不用死记硬背,我平时也是凭手感输入,z代表调用gzip进行压缩,c代表创建新压缩包,v可以展示压缩全过程,方便随时排查问题,f就是指定压缩文件名称。
之前试过舍弃v参数,直接静默压缩,结果中途文件权限报错,自己完全不知情,最后生成的压缩包残缺不全,里面少了大半核心文件。从那之后,不管多麻烦,执行tar压缩命令都会带上v参数。
别盲目乱用zip格式,这是我实操下来最直白的感受。zip的优势只是能跨Windows和Linux系统通用,但压缩效率远不如tar.gz。同样一份两百多兆的项目源码,tar.gz压缩后能缩减到一百兆左右,zip最多只能压缩到一百五十兆上下,差别肉眼可见。而且linux多数服务器默认没有预装zip组件,使用前还要额外下载安装,纯属多此一举。
上次处理完一批过期的备份文件,批量压缩了十几个日志文件夹,敲完最后一条tar命令后,指尖无意识的在键盘空白处敲了两下。盯着终端页面上不断滚动的压缩进度提示,忽然觉得之前耗费好几天踩的各种小坑,现在回头看都不值一提。唯一可惜的是最开始弄丢的那份独家配置文件,至今都没能复原最初的完整版本。