第2节. 文件压缩和解压缩
参数太多,一个个传进去
touch
rm
等命令后面的参数都有上限的。
touch f{1..100000000}应该就会报错,
xargs可以解决该问题
没有标准输入,怎么传给他比如rm
上图 ls是没有标准输入的,管道符是传不过去的,所以说它是错误的,不是说:+号过时了用/替代。
参数太长怎么办
利用xargs获取stdin来传给rm -f作为参数
▲xargs是用来传参数的。
注意默认行为,达到一定长度就换行了
上图不是一个个传给touch的,而是一堆堆,大概是2000+一次传给touch,一个个传如下图
就是说 touch f1 f2 f3 这种一下创建多个文件,xargs 一行传过去也没问题,但是useradd xx yy 的yy生效的,所以需要换行。
创建10个用户
/7000,0不关心,7就是111,针对3个特殊权限有一个有就行
上图因为没有xargs传过去,所以就仅执行了ls -SL,验证下👇
find 后删除
上面是表面上合理,但可能有问题的。
特殊情况案例:单个文件名称位"fa b.txt"中间带空格。
观察上面报错,find 传给xargs后xargs默认是空格作为分隔符,所以"fa b.txt"就被判定位fa和b.txt两个文件了。
print0 是啥呢?是ASCII码为0,可不是十进制的0哦。
验证下-print0的分隔符为null的效果👇
这是txt的t后买那就是00(print0)
-print0就是为了避免文件名带特殊符号。
第一个示例,是原地目录备份提好的,好在如果备份到其他地方存在子,子子文件夹不存在的情况从而报错的。要么复制其他目录就别带文件夹了,统统放在一个层级下就是不带{}的意思,这样又会存在文件同名的问题。详情见上一章节的文末内容。
练习
打包压缩 gz bz2 xz 3个主流
压缩要消耗CPU的,看你需求,你的磁盘空间大,你需要节省CPU消耗,就不压。空间换性能(时间)
compress默认压缩后原文件就没了。
👆上图就是compress比较聪明,不给你压缩.jgp文件。同样👇issue根本不给你压缩。
compress是标准输入的信息进行压缩,完了屏幕上打印ctrl+d退出可见,可能存在乱码。
zcat直接预览
gz后缀用的多
也是压完,原文件没了。
gzip -d 一样的也是gunzip解压
压缩比
gzip也是标准输入形式,不过要带上-f
其实有没有标准输入都可以传的,有就用|,没有就用xargs。
当一个命令的标准输出非常大,比如数据库特别大就(压缩一下放硬盘里),就可以使用gzip配合生成文件。
bz2 压缩比跟高
bz还是比gz的9级,压缩度还要高。
所以
看下两个压缩算法:
上图的-r是不是写错了,应该是-R啊?⚪表示疑问。
👇解是能解,但是不能tab补全
👇这次都不能解了
后缀很关键啊
gzip、bz2 、xz 三种压缩,网上比较多。
zcat看.gz和.Z;bzcat看.bz2;xzcat看xz
xz 压缩工具
所以linux内核就是用xz
xz 压缩和解压缩速度慢,耗时长。
理论上xz要强,但是数据量不大的时候,还不如bz2。
观察
这里都是有tar
结论:都需要先用tar打个包,再用gz,bz2,xz去压缩(这些工具只能针对一个文件去压缩,不能针对文件夹)。
打完包就是一个文件了,再压就行了。
zip打包和压缩
这个勾选,你感觉不到什么变化,该怎么用还是怎么用。就是读取的时候会自动压缩解压缩。NTFS有这个压缩功能。
zip在windows和linux都是一样的软件
adding:下面的明细etc前头是没有/的,就是担心将来你解压缩导致覆盖了/etc。目的就是让你解压到当前文件夹下。👈压缩的时候把/etc/变成了etc/,把/根拿掉了,防止你加压缩把根下面的etc覆盖掉了,所以给你变成了相对路径。
👆上面的压完后再看:白压了,越压越大了,哈哈,找原因:
因为把内存里的文件带上了吧?搞不清⚪存在问题。
前面sysconfig是压缩后产生的文件,会自动打赏后缀.zip的。
管道符的使用▲ 线索总结
这是解压后重定向到文件中。
原来是436K压缩后为93K