1、locate
查询系统上预建的文件索引数据库:/var/lib/mlocate/mlocate.db
依赖于事先构建的索引
索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库(updatedb)
索引构建过程需要遍历整个根文件系统,极消耗资源
工作特点:
- 查找速度快
- 模糊查找
- 非实时查找
- 搜索的是文件的全路径,不仅仅是文件名
- 可能只搜索用户具备读取和执行权限的目录
有用的选项
-i不区分大小写的搜索
-n N只列举前N个匹配项目
- 举例
locate conf ---搜索名称或路径中带有“conf”的文件
locate -r "\.conf$" ---使用Regex来搜索以“.conf”结尾的文件
2、 find
实时查找工具,通过遍历指定路径完成文件查找
工作特点:
- 查找速度略慢
- 精确查找
- 实时查找
- 可能只搜索用户具备读取和执行权限的目录
语法:
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
- 举例
find /etc/ -name "*.conf" ---文件名称支持使用通配符glob
find /etc/ -maxdepth 1 -name "*.conf" ---最大搜索目录深度为1
find /etc/ -maxdepth 2 -mindepth 2 -name "*.conf" ---只搜索第二层级
find / inum 2 -ls ---从根开始搜节点编号为2的文件并显示出来
find / -samefile f1 ---从根开始搜和f1节点号相同的文件
find /etc/ -regex ".*\.conf$" --- -regex 支持正则表达式,匹配的是整个文件的路径,而不仅仅是文件名
find / -user zhang -group zhang 所有者和所属组都是zhang的文件
-uid -gid -nouser -nogroup
find /etc/ -type l -ls ---按文件类型查找
f 普通文件 d目录文件 l链接文件 s套接字文件 c字符文件 d设备文件 p管道文件
find /etc/ -size +10k -size -20k ---根据文件大小查找
find / -size 1024k ---表示(1023-1024k]
find / -size 1M ----表示(0-1M] 这个搜出来的结果比较多,因为是从0开始的
-size +10k ----表示(10k-∞)
-size -10k ----表示[0-9k]
-size 10k ----表示(9-10k]
3、德摩根定律
组合条件:
与:-a
或:-o
非:-not, !
德·摩根定律:
(非A) 或(非B) = 非(A 且B)
(非A) 且(非B) = 非(A 或B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
- 举例
find / ! \( -user root -o -user zhang \) =find / ! -user root -a ! -user zhang --- !也可以用 -not表示
find /tmp -user root -o -not -name "f*"
[root@centos6 ~]#find /tmp -user root -o -not -name f* ---文件名用通配符表示必须用双引号,不然无法显示
find: paths must precede expression: f3
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
[root@centos6 ~]#find /tmp \( -user root -o -not -name "f*" \) -ls|wc -l
155 ---如果前面有或者的关系,用ls显示时要加括号,否则只显示或者之后匹配的内容
[root@centos6 ~]#find /tmp -user root -o -not -name "f*" -ls|wc -l
2
find /etc/ \( -path '/etc/sane.d' -o -path '/etc/fonts' \) -a -prune -o -name "*.conf" ---表示遇到括号里面的路径就挑出来不去搜索,但列出来这两个路径,搜索/etc/下文件名为以.conf结尾的文件。
[root@centos6 ~]#find /etc/ \( -path '/etc/sane.d' -o -path '/etc/fonts' \) -a -prune -o -name "*.conf"|wc -l
263
[root@centos6 ~]#find /etc \( -path '/etc/sane.d' -o -path '/etc/fonts' \) -a -prune -o -name "*.conf"|grep "sane.d"
/etc/sane.d ---只列出目录
[root@centos6 ~]#find /etc \( -path '/etc/sane.d' -o -path '/etc/fonts' \) -a -prune -o -name "*.conf"|grep "fonts"
/etc/fonts ---只列出目录,不进入搜
4、根据时间戳
以“天”为单位;
-atime[+|-]#, 10表示[10,11) ;+10表示[11,∞)-10表示[0,10)
-mtime
-ctime
以“分钟”为单位:
-amin
-mmin
-cmin
[root@centos7 app]#useradd haha;find /etc/ -mmin -1
useradd: user 'haha' already exists
/etc/
/etc/group
/etc/gshadow
/etc/passwd
/etc/shadow
[root@centos7 app]#userdel -r haha;find / \( -path "/proc" -o -path "/sys" \) -a -prune -o -mmin -1 |wc -l
21
5、根据权限
find -perm 755会匹配权限模式恰好是755的文件 ---表示精确匹配必须是权限为755的文件
find -perm +222或find -perm /222 ---表示三种人有一种人至少有写权限的文件,centos7中+被淘汰,使用/
find -perm -222 ---表示三种人都必须至少有写权限
find -perm -022 ---表示所有者不关心,其他两种人必须都至少有写权限
总结:0只有在不是精确匹配的情况下才表示不关心。
6、参数替换xargs
由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令
xargs用于产生某个命令的参数,xargs可以读入stdin(标准输出)的数据,并且以空格符或回车符将stdin的数据分隔成为arguments
注意:文件名或者是其他意义的名词内含有空格符的情况
有些命令不能接受过多参数,命令执行可能会失败,xargs可以解决
举例
echo f{1..100}|xargs touch
echo f*|xargs rm -f
总结:用echo显示多个文件可以避免ls显示时因参数过多无法显示的情况,用xargs将参数一个一个的传给touch和rm也可以避免文件过多无法创建或删除的情况
7、文件解压缩
(一)gzip/gunzip
- gzip 压缩,生成.gz后缀压缩文件,程序对后缀名敏感
-d 解压缩,相当于gunzip
-c 结果输出至标准输出,可使用重定向在压缩/解压缩时保留源文件
-# 指定压缩比1-9,值越大压缩比越高,默认为6 - gunzip 解压缩,程序对后缀名敏感
-
zcat 解压缩结果输出至标准输出,可视作gunzip -c
实验:
(二)bzip2/bunzip2
- bzip2 压缩,生成.bz2后缀压缩文件,程序对后缀名敏感
-d 解压缩,相当于bunzip2
-k 保留源文件
-# 指定压缩比1-9,值越大压缩比越高,默认为9 - bunzip2 解压缩,程序对后缀名敏感
-
zcat 解压缩结果输出至标准输出,可视作gunzip -c
实验:
(三)xz/unxz/xzcat
- xz 压缩,生成.xz后缀压缩文件,程序对后缀名敏感
-d 解压缩,相当于unxz
-k 保留源文件
-# 指定压缩比1-9,值越大压缩比越高,默认为6 - unxz 解压缩,程序对后缀名敏感
- xzcat 解压缩结果输出至标准输出,可视作unxz -c
实验:
从结果可以看出,当改变压缩文件的后缀.xz
后无法解压。unxz
解压对文件后缀名敏感。上文的uncompress
,gunzip
,bunzip2
都是后缀名敏感的。
(四)zip/unzip
- 可以打包压缩解压缩,而之前的compress,gzip,bzip2,xz只能压缩单个文件
-
语法:
zip 压缩后文件 压缩前文件
-r 递归压缩文件夹,用于打包压缩
-p 解压缩结果输出至标准输出,可重定向至文件
实验:
(五)tar 磁带归档
- 语法:
tar [option...] [file]...
- 用法:
tar cf file.tar file... //创建归档
tar rf file.tar file... //追加文件至归档,不支持对压缩文件追加归档
tar tf file.tar //查看归档文件中的文件列表
tar xf file.tar //展开归档,解包文件输出至当前目录
tar xf file.tar -C path //展开归档,解包文件输出至指定目录path
tar zcf file.tar.gz file... //创建归档并使用gzip压缩,bzip2使用选项j,xz使用选项J
tar zxf file.tar.gz
//解压缩tar.gz压缩包,bzip2使用选项j,xz使用选项J,系统会自动识别压缩文件类型,z、j、J可以省略
tar zcf file.tar.gz -T includefilelist -X excludefilelist
//T选项指定压缩文件列表includefilelist,X选项指定排除压缩文件列表excludefilelist
- split 分割压缩文件 split -b size -d tar-file-name prefix-name
- -b选项指定分割单位,-d选项指定被分割的压缩文件和分割后的文件群前缀
- 使用cat配合重定向合并被分割压缩文件
cat file-part* > file.tar.gz
- 实验:
1、将/etc
目录下所有以f开头的文件和目录压缩为file.tar.gz
文件
2、查看file.tar.gz
文件内的文件列表的前5行
3、将file.tar.gz
文件解压缩,解压缩文件输出至/boot
目录
4、分割file.tar.gz
文件,以3k为分割单位,分割文件前缀为file-part
5、将分割的文件合并为文件file1.tar.gz
6、cpio工具
可以把文件打包压缩成.cpio或.tar结尾的文件
find ./etc |cpio -ov >etc.cpio ---打包
cpio -t <etc.cpio ---预览包
cpio -iv <etc.cpio ---解包