2018-02-22 文件查找和压缩

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
    实验:


    2018-02-22 文件查找和压缩_第1张图片
    image.png

(二)bzip2/bunzip2

  • bzip2 压缩,生成.bz2后缀压缩文件,程序对后缀名敏感
    -d 解压缩,相当于bunzip2
    -k 保留源文件
    -# 指定压缩比1-9,值越大压缩比越高,默认为9
  • bunzip2 解压缩,程序对后缀名敏感
  • zcat 解压缩结果输出至标准输出,可视作gunzip -c
    实验:


    2018-02-22 文件查找和压缩_第2张图片
    image.png

(三)xz/unxz/xzcat

  • xz 压缩,生成.xz后缀压缩文件,程序对后缀名敏感
    -d 解压缩,相当于unxz
    -k 保留源文件
    -# 指定压缩比1-9,值越大压缩比越高,默认为6
  • unxz 解压缩,程序对后缀名敏感
  • xzcat 解压缩结果输出至标准输出,可视作unxz -c
    实验:
    2018-02-22 文件查找和压缩_第3张图片
    image.png

    从结果可以看出,当改变压缩文件的后缀.xz后无法解压。unxz解压对文件后缀名敏感。上文的uncompress,gunzip,bunzip2都是后缀名敏感的。

(四)zip/unzip

  • 可以打包压缩解压缩,而之前的compress,gzip,bzip2,xz只能压缩单个文件
  • 语法:
    zip 压缩后文件 压缩前文件
    -r 递归压缩文件夹,用于打包压缩
    -p 解压缩结果输出至标准输出,可重定向至文件
    实验:


    2018-02-22 文件查找和压缩_第4张图片
    image.png

(五)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目录
    2018-02-22 文件查找和压缩_第5张图片
    image.png

    4、分割file.tar.gz文件,以3k为分割单位,分割文件前缀为file-part
    5、将分割的文件合并为文件file1.tar.gz
    2018-02-22 文件查找和压缩_第6张图片
    image.png

    6、cpio工具

可以把文件打包压缩成.cpio或.tar结尾的文件

find ./etc |cpio -ov >etc.cpio ---打包
cpio -t 

你可能感兴趣的:(2018-02-22 文件查找和压缩)