前言:
压缩文件原理、
常用压缩命令(zip、gzip、baip2、xz、tar)、
文件搜索 find、
sort 排序、
uniq 去重
导图
压缩和归档
压缩文件原理
-
经过压缩软件压缩的文件叫压缩文件;
-
压缩的原理是把文件的二进制代码压缩,把相邻的0、1代码减少,
比如有000000,可以把它变成6个0 的写法60,来减少该文件的空间。 -
还有的压缩,同样是在二进制数据里,将所以的0删除,压缩成压缩包,解压的过程中,会再次将0补充进去。
-
压缩文件的基本原理:
是查找文件内的重复字节,并建立一个相同字节的"词典"文件,并用一个代码表示,
比如在文件里有几处有一个相同的词,用一个代码表示并写入"词典"文件,这样就可以达到缩小文件的目的。 -
打包:即归档
-
压缩:为了减少占用的磁盘空间,可以做备份,在网络上传输时节省网络带宽。
-
常见打包压缩软件
windows:winrar 360压缩 好压 7zip winzip
linux:压缩格式:gz ,bz2,xz,zip
压缩算法不同,导致压缩比不同
常用压缩命令:
zip
压缩后的文件以.zip结尾,可以压缩目录
压缩的语法:
zip filename.zip file1 file2 ...
zip 压缩后的文件名 压缩文件
压缩文件:
# zip test.zip test.txt
>PS: 压缩后不删除原文件
解压:unzip
-d:指定解压路径
# unzip test.zip -d /tmp
压缩目录操作相同
实例:
做一个100M大小的文件,用于测试压缩
# dd if=/dev/zero of=test.txt bs=100M count=1
gzip
gzip ./testfile
默认会删除原文件
-d 解压缩
-n: 指定压缩比,压缩比越小,速度越大
压缩级别:1~9; 1级别最低,速度最快,压缩率最低;9级 别最高,速度最慢,压缩最高;默认级别是6
不解压的情况下查看文本的压缩文件
zcat testfile
默认后缀名:.gz
gzip压缩时,原文件消失,生成压缩文件
解压:gunzip
gzip的压缩包,在解压后,压缩包消失,解压后的文件出现
bzip2
默认情况下,压缩完成,原文件也是消失的,压缩包必须以.bz2结尾的
通常能够生成比使用gzip压缩更小的文件(压缩比较高)
1)压缩
# bzip2 testfile
-d:解压
-n:指定压缩比
-k:保留原文件
2)解压
bunzip2 testfile
3) 不解压查看
bzcat testfile
xz
1) 压缩
# xz testfile
2)解压
# unxz testfile
或
# xzdec -d testfile
-k: 保留原文件
-c: 输入到屏幕
3) 不解压查看
# xzcat testfile
tar
既可以打包,又可以压缩
tar 选项 打包名 打包的文件或目录
注:注意语法格式,先是打包后的名字,然后才是要打包的东西
选项 | 描述 |
---|---|
-c | 创建归档文件 |
-f | 指定备份文件 |
-x | 展开归档 |
-C | 解压时指定路径 |
-v | 显示详细过程 |
-p | 保留权限信息 |
-t | 不展开归档,查看归档文件 |
-r | 向包中追加文件,不能追加压缩的文件 |
-z | 表示使用gzip压缩方式压缩或者解压缩 |
-j | 表示使用bzip2压缩方式压缩或者解压缩 |
-f | 指定文件,一般后面跟包名 |
–xattrs | 归档时,保留文件的扩展属性信息 |
1、压缩
-zcvf zcvf .tar.gz
-jcvf jcvf .tar.bz2
# tar zcf testfile.tar.gz ./testfile
2、解压
# tar zxf testfile.tar.gz -C ./testfile
3、不解压查看
# tar -tf testfile.tar.gz
4、追加文件
# tar -rf 包名 追加的文件
# tar -rf testfile.tar.gz add.txt
注:不能追加压缩文件
# tar -zcf testfile.tar.gz testfile ON
# tar -cf testfile.tar.gz testfile YES
文件搜索
别名
- 1 查看别名
# alias
- 2 设置别名
1)临时
# alias vi='vim'
2)永久,在配置文件中添加
# vim ~/.bashrc
- 3、取消别名
# unalias vi
补充:which 用来查找命令的绝对路径
find
–全局性搜索文件
–工作方式:沿着文件的层次结构依次向下搜索,找到符合条件的,打印或者是执行相应的操作
-
注:find 命令我用的最多是按照文件名才搜索,按照其他方式搜索,可以作为参考,部分地方可能有错误,用的时候需要改
-
语法格式
find <路径> <选项(条件)> <动作>
一般情况下,查找范围越大,目录层级越深,查找速度就越慢 -
按照文件名搜索
-iname:忽略大小写
通配符:
*代表任意字符
?代表单个字符举例:
查找/etc目录下,所有以.conf结尾的文件
# find /etc/ -name *.conf
查找/etc目录下,包含conf的文件
# find /etc/ -name *conf*
查找/etc/目录下,以.conf结尾,名称是5个字符的
# find /etc/ -name ?????.conf
- 按照文件类型查找
f:普通文件
查找/var目录下类型是链接的文件
# find /var -type l
查找系统中类型是套接字的文件
# find / -type s
查找的时候,可能会遇到No such file or directory的错误提示,是正常的
若不想看到可以将错误重定向到“黑洞”(/dev/null)
# find / -type s 2> /dev/null
- 按照时间查找
-atime n 以天为单位
-ctime n
-mtime n
一个文件有三个时间:
atime:访问时间,cat more less ... ...
mtime:文件的内容发生变化的时间 vim ... ... (也是 ll 所显示的时间)
ctime:文件的属性发生变化的时间 比如:权限改变、大小改变、所有者、所属组等改变
-amin n 以分钟为单位
-cmin n
-mmin n
以n等于7为例:
搜索最近七天内被访问过的所有文件
find . -type f -atime -7
搜索恰好在七天前被访问过的所有文件
find . -type f -atime 7
搜索超过七天内被访问过的所有文件
find . -type f -atime +7
搜索访问时间超过10分钟的所有文件
find . -type f -amin +10
- 按照用户和组查找
-user 用户名
-group 组名
-uid uid
-gid gid
-nouser:孤儿文件 没有所有者的文件
-nogroup:没有所属组的文
举例:
查找系统中所有者是 user1的文件
# find / -user user1 -type f
查找系统中的孤儿文件
# userdel user1
# find . -type f -nouser
取反
查找 当前目录中 文件名不是testfiles的文件
# find ./ ! -name testfiles
添加多个条件
查找系统中所有者不是root或者类型是套接字的文件
# find / ! -user root -o -type s
- 按照权限查找
/222 或者 (用户可写or组可写or其他人可写) 二进制中有1的位置,只要满足其中一个位就可以
-222 并且 (用户可写and组可写and其他人可写) 二进制中有1的位置必须都要有1
# cd /find/
[find]# touch p{r,w,x}_{1,2,3}
[find]# chmod 400 pr_1
[find]# chmod 440 pr_2
[find]# chmod 444 pr_3
[find]# chmod 200 pw_1
[find]# chmod 220 pw_2
[find]# chmod 222 pw_3
[find]# chmod 100 px_1
[find]# chmod 110 px_2
[find]# chmod 111 px_3
查找find目录下,小组权限为可写的文件
# ll `find ./ -perm -g=w -type f`
--w-- w---- . 1 root root 0 Mar 31 14:38 ./pw_2
--w-- w-- w-. 1 root root 0 Mar 31 14:38 ./pw_3
# ll `find ./ -perm /g=w -type f`
--w-- w---- . 1 root root 0 Mar 31 14:38 ./pw_2
--w-- w-- w-. 1 root root 0 Mar 31 14:38 ./pw_3
查找find目录下,用户可写and组可写and其他人可写的文件
[find]# ll `find ./ -perm -222 -type f`
--w--w--w- 1 root root 0 Aug 13 15:13 ./pw_3
查找find目录下,用户可写or组可写or其他人可写
[find]# ll `find ./ -perm /222 -type f`
--w ------- 1 root root 0 Aug 13 15:13 ./pw_1
--w --w---- 1 root root 0 Aug 13 15:13 ./pw_2
--w --w-- w- 1 root root 0 Aug 13 15:13 ./pw_3
- 按照文件大小查找
+大于
-小于
直接数字 等于
‘b’ for 512-byte blocks (this is the default if no suffix is used) //0.5KB
‘c’ for bytes
‘w’ for two-byte words
‘k’ for Kilobytes (units of 1024 bytes)
‘M’ for Megabytes (units of 1048576 bytes)
‘G’ for Gigabytes (units of 1073741824 bytes)
举例:
[find]# rm -f /find/*
[find]# dd if=/dev/zero of=f1M bs=1M count=1
[find]# dd if=/dev/zero of=f2M bs=1M count=2
[find]# dd if=/dev/zero of=f3M bs=1M count=3
[find]# dd if=/dev/zero of=f4M bs=1M count=4
查找目录下,文件大小小于3M大小的文件
[find]# find . -type f -size -3M
./f2M
./f1M
查找目录下,文件大小等于3M大小的文件
[find]# find . -type f -size 3M
./f3M
查找目录下,文件大小大于3M大小的文件
[find]# find . -type f -size +3M
./f4M
- 动作
-exec 动作 -- 找到结果之后直接执行动作
-ok 动作 -- 执行动作之前先提示,即需要交互
举例:
[find]# find . -type f -size +3M -exec ls -l {} \;
-rw-r--r-- 1 root root 4194304 Aug 13 15:51 ./f4M
[find]# find . -type f -size +3M -ok ls -l {} \;
< ls ... ./f4M > ? y
-rw-r--r-- 1 root root 4194304 Aug 13 15:51 ./f4M
[find]# find . -type f -size +3M -ok ls -l {} \;
< ls ... ./f4M > ? n
练习:
1、查找/find目录下,类型是 普通文件的文件将其移动到/test目录下
[find]# find . -type f -exec mv {} /test \;
[find]# ls /test
f1M f2M f3M f4M
或者
[find]# mv `find . -type f` /test
2、查找/test目录下类型为普通文件的文件,对其进行备份,备份文件的后缀名为.bak
[find]# find /test -type f -exec cp {} {}.bak \;
[find]# ls /test
f1M f1M.bak f2M f2M.bak f3M f3M.bak f4M f4M.bak
3、删除/test目录下修改时间在一天以内的普通文件
[find]# find /test/ -type f -mtime -1 -exec rm {} \;
sort 排序
-t:指定字段分隔符
-k:指定第几个字段
-n:按照数字顺序排序
-r:反向排序
-u:排序后重复行只打印一次 unique
# cat sort.txt
b:3
c:2
a:4
e:5
d:1
f:11
对输出内容直接排序,默认按照每行的第一个字符进行排序
# cat sort.txt | sort
a:4
b:3
c:2
d:1
e:5
f:11
对输出内容进行反向排序
# cat sort.txt | sort -r
f:11
e:5
d:1
c:2
b:3
a:4
使用 ":" 做分隔符,对第2个字段进行排序
# cat sort.txt | sort -t ":" -k 2
d:1
f:11
c:2
b:3
a:4
e:5
使用 ":" 做分隔符,对第2个字段进行排序,按照数字大小排序
# cat sort.txt | sort -t ":" -k 2 -n
d:1
c:2
b:3
a:4
e:5
f:11
对/etc/passwd文件按照uid来排序
# sort -t ":" -k 3 -n /etc/passwd
对passwd文件按照uid由大到小的顺序排序
# sort -t ":" -k 3 -nr /etc/passwd
按照gid由小到大的顺序打印/etc/group
# sort -t: -k 3 -n /etc/group
uniq 去重,唯一
去除相邻重复行
-c: 显示重复的行数
-i: 忽略大小写
# uniq num.txt
111
222
333
444
222
555
使用uniq时,一般先排序,再去重
# sort num.txt | uniq
111
222
333
444
555
[loring test]# sort num.txt | uniq -c
1 111
3 222
2 333
1 444
1 555