Linux学习13-文件查找

本文详细介绍了在Linux系统中查找文件的各种方法,包括locate命令的快速模糊查找,find命令的精确实时查找,以及参数替换工具xargs的使用。此外,还探讨了常见的压缩和归档工具,如gzip、bzip2、xz、zip、tar等的使用方法和特点,以及如何结合tar与其他压缩工具进行文件的归档和压缩。文章最后提到了文件分割以及一些查找文件的实践练习。

#文件查找和压缩
##一、在文件系统上查找符合条件的文件

###locate命令

查询系统上预建的文件索引数据库。
索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库(updatedb),索引数据库路径/var/lib/mlovate/mlocate.db二进制文件,不要cat查看。

工作特点:

  1. 查找速度快,因为寻找的数据是由已建立的数据库/var/lib/molvate/提供,不用去硬盘当
    中存取数据
  1. 模糊查找
  2. 非实时查找
  3. 搜索文件的全路径,不仅仅是文件名
  4. 可能只搜索用户具备读取和执行权限的目录
	     格式:    locate  KEYWORD
	     选项: 
	          -i     不区分大小写的搜索
	          -n N   只列举前n个匹配项目
	          -r     使用正则表达式
		
		例:搜索名称或路径中带有conf的文件 
             locate –r  `\.conf$`

###find命令

  1. 工作特点:
  1. 查找速度略慢
  2. 精确查找
  3. 实时查找
  4. 可能只搜索用户具备读取和执行权限的目录
  1. 格式: find [option]…[查找路径][查找条件][处理动作]

查找路径:指定具体路径;默认为当前路径

查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找
出指定路径下的所有文件

按搜索层数查找:

    	-maxdepth level      最大搜索目录深度,指定目录为第1级
	    -mindepth level      最小搜索目录深度

     例:搜索/data/目录的第二层目录。需要最大深度和最小深度一起用
      [root@V9centos7 /data]#find /data -maxdepth 2  -mindepth 2
	    /data/txt1/txt2

根据文件名和iNode查找:

    -name “file”:      精确匹配,可以使用通配符
    -iname “file”:     忽略大小写
    -inum  n:          按inode号查找
    -samefile “file”:   查找相同的文件(indoe相同)
    -links  n:          链接数为n的文件
    -regex“PATTERN”:   以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

    例1:查看.sh的文件
    [root@V9centos7 ~]#find -name  "*.sh"
    ./bin/newhello.sh
    ./bin/useradd.sh
    ./bin/systeminformation.sh
    ./bin/useradd2.sh
    ./bin/vreatescript.sh
    ./taxt.sh

    例2:查看链接数为5的文件
    [root@V9centos7 ~]#find -links 5
    ./.cache/gnome-software/3.22

    例3:利用正则表达式查.sh后缀的文件
    [root@V9centos7 ~]#find -regex ".*\.sh$"
    ./bin/newhello.sh
    ./bin/useradd.sh
    ./bin/systeminformation.sh
    ./bin/useradd2.sh
    ./bin/vreatescript.sh
    ./taxt.sh

根据属主、属组查找:

    -user USERNAME:查找属主为指定用户(UID)的文件
    -group GRPNAME:查找属组为指定用户(GID)的文件
    -uid UserID:   查找属主为指定的UID号的文件
    -gid GroupID:  查找属组为指定的GID号的文件
    -nouser:        查找没有属主的文件
    -nogroup:       查找没有属组的文件

    例1:查找文件所有者和所属组都是v9的文件
        find -user v9 -group v9
    例2:查看没有属主和/或属组的文件
        find -nouser  -nogroup
        find -nouser -o  -nogroup

根据文件类型查找:

    -type TUPE
         f :普通文件
         d :目录文件
         l :符号链接文件
         s :套接文件
         b :块设备文件
         c :字符设备文件
         p :管道文件
    -empty : 空文件或目录

    例:查看当前目录为空的.changed文件
    find -empty -type f  -name "*.changed"

组合条件

     与:-a
     或:-o
     非:-not,!

    德•模梗定律
    (非A)或(非B)=非(A且B)
    (非A)且(非B)=非(A或B)
     !A  -a !B=!(A  -O  B)
     !A  -O !B=!(A  -a  B)

    例:找到 /data文件夹中非a开头和非f开头的文件,并显示
    find /data !  \(-name "*f" -o -name *a")  -ls

匹配与排除目录

		    -path   匹配文件路径或者文件
	        -prune  将某目录排除

    例:查找/etc下,除/etc/sane.d目录其他所有.conf后缀的文件
    find  /etc/  -path  "/etc/sane.d"  -a -prune -o -name '*.conf'

根据文件大小来查找

     -size [+|-]#UNIT      常用单位:k,M,G,c(byte)
	   #UNIT:(#-1,# ]      如:6k表示(5k,6k ]
       -#UNIT:[0,#-1]      如:-6k表示[0,5k]
        +#UNIT:(#,∞)       如:+6k表示(6k, ∞)

     例1:查找/data下8M的文件,查找结果为,7M<结果≤8M
              find  /data  -size  8M
     例2:find /data -size 1024,其搜索结果为,1023<结果≤1024

根据时间戳 :

	以“天”为单位  
		-atime   [+|-]#
        -mtime   [+|-]#
        -ctime   [+|-]#        
         #:[#,#+1) 
           代表#-#+1的那一天
        +#:[#+1, ∞]
           代表大于等于#+1天前的文档
        -#:[0,#)
           代表小于等于#天内的文档

	 以“分钟”为单位
         -amin
         -mmin
         -cmin

根据权限查找

     -perm  [/|-] MODE
             MODE:精确权限匹配 
            /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,从   
                   centos6使用+MODE
            -MODE:每一类对象都必须同时拥有指定权限,与关系,不能少于指定权限值,  
                   多可以,与精确匹配不同
            
            例1:find -perm 755会匹配权限模式恰好是755的文件
            例2:find -perm -222会匹配最低为所有人有写权限的所有文件
            例3:find -perm /222会匹配u或g或o有写权限的所有文件

处理动作:对符合条件的文件做操作,默认输出至屏幕

              print:默认的处理动作,显示至屏幕
                -ls:类似于对查找到的文件执行“ls -l”命令
            -delete:删除查找到的文件
          -fls file:查找到的所有文件的长格式信息保存至指定文件中
  -ok COMMAND {} \;:对查找到的每个文件执行有COMMAND指定的命令,对于每个文件
                     执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \;:对查找到的每个文件执行有COMMAND指定的命令
                 {}:用于引用查找到的文件名自身
                    
        例1:将文件夹中others的写权限去掉,{}表示find查找到的结果,\;表示结束语
            find -perm -002  -exec chmod o-w {} \;
        例2:将/data文件夹中所有a开头的文件,加上.txt后缀
            find /data  -name  "a*" -exec mv {} {}.txt \;

###参数替换xargs

由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令

用法:xargs用于产生某个命令的参数,xargs可以读入标准输入(stdin)的数据,并且以空格或回车符将stdin的数据分隔成为参数(arguments)

例1:ls命令不能接受标准输入,用xargs命令将标准输出传给ls作为参数。
             find /data -perm /700 |xargs ls -l
例2:使用xargs,突破参数太长的限制,执行命令。创建N多个文件,并删除。
             echo {1..1000}|xargs touch
             echo {1..1000}|xargs rm

###Gnome 搜索工具

    图形化搜索工具,位置→搜索文件...... 
        •命令
        •内容
        •用户/组群
        •大小
        •修改时间

##二. 压缩、解压缩及归档工具
压缩原理,将出现频率高的字符串,用单个字母代替(jpg不适合压缩),压缩算法在不断优化,可能不同。

1、file-roller 图形界面的压缩工具

2、compress/cuncompress: 后缀.Z
目前已经淘汰,遇到.Z的压缩文件可以通过命令znew
将该文件转出gzip的格式。

外部命令:   compress [-dfvcVr][-b maxbits] [file...]
    参数:  -d      压缩文件    解压后,解压缩后原有文件就删除了
			-c     file  压缩过程不生成压缩包,需要重定向到压缩文件
            -v     显示详情
  解压命令:  uncompress  file 重定向可以保留旧的内容    
      命令:  zcat  把文件解出来在屏幕打印  重定向得到文件 

3、gzip/gunzip 后缀.gz
对目录压缩,是指将所有文件分别进行压缩

格式:   gzip   option... file...如果没有文件则将标准输入压缩传给标准输出
选项:   -d:解压缩,相当于gunzip
        -c:将压缩或解压缩的结果输出到标准输出,可通过重定向处理
        -#:1-9,指定压缩比,值越大压缩比越大,-1最快,压缩比最差,默认-6
解压命令: zcat     解压并打印到屏幕,重定向得到文件
         gunzip   解压完原始文件就不在了
         gzip -d

例3.1:将/etc/下文件services,复制到实验目录/data下,用gzip压缩。默认状态下原本的文件会被
    压缩成.gz的文件名,源文件就不在了,可通过重定向保留原文件
    [root@V9centos7 /data]#gzip -c services  > servixes.gz
    原文件:-rw-r--r--. 1 root root 136088 Aug  8 16:33 services.gz
    压缩后:-rw-r--r--. 1 root root 136088 Aug  8 16:33 services.gz

4、bzip2/bunzip2: 后缀.bz2

 格式:bz2  option... file...
 选项:   -k:keep,保留原始文件
         -c:将压缩或解压缩的结果输出到标准输出,可通过重定向处理
         -d:解压缩
         -#:1-9,压缩比,默认为9
 解压命令:bzcat  可以重定向得到解压文件
         bunzip2 
         bz2 -d

例4.1:将例3.1中的文件services文件使用bzip2压缩,与gzip相比压缩比更高
    [root@V9centos7 /data]#bzip2 -cv services>services.bz2
    压缩后-rw-r--r--. 1 root root 123932 Aug  8 16:58 services.bz2

5、xz/unxz: 后缀.xz
较新,兼容性可能不好,压缩比高,运算时间长

	格式:xz  option... file...
    选项:
	 -l:列出压缩文件的相关信息
	 -k:keep,保留原文件
     -c:将压缩或解压缩的结果输出到标准输出,可通过重定向处理
     -d:解压缩
     -#:1-9,压缩比
    解压:xzcat  可以重定向得到解压文件
         unxz
         xz -d

例5.1:将例3.1中的文件services文件使用xz压缩,比bzip2压缩比更高
    [root@V9centos7 /data]#xz -kv services
    压缩后-rw-r--r--. 1 root root  99608 Aug  8 16:33 services.xz

6. zip/unzip

可以打包整个目录,打包时将文件改为相对路径,解压时会解压在生成压缩目录,
防止误操作覆盖原文件,压缩比一般。

   打包压缩      zip –r    /testdir/sysconfig    etc/sysconfig/
                        生成的文件(可换)        目标目录
   解包解压缩    unzip sysconfig.zip
                cat /var/log/messages|zip messages – 
                         '-'代表管道前的输出结果
            unzip  -p message>message  不加-p解压得到原文件名,-p打印出来重定向,可以换文件名

7、tar(Tape Archive,磁带归档的缩写)
使用tar压缩后,同样每个文件名都没了根目录,主要是为了安全,使用tar备份/root/etc下的数据可能会需要压缩回来使用,在tar所记录的文件名就是解压缩后的实际档名,拿掉了根目录,假设将备份的数据在/tmp解开,那么解压缩的档名就会变成/tmp/etc/xxx,但如果没有拿掉目录,解压缩后档名就是绝对路径,数据会覆盖到到/etc/xxx去,原本的/etc/下的数据就会丢失。

格式tar[option]…
五个独立的选项,可以和别的命令连用,但一次只能用其中一个

    -c:建立一个压缩文件
    -x:解开一个压缩文件
    -t:查看压缩文件里面的文件
    -r:向压缩文件末尾追加文件
    -u:更新压缩包中的文件

7.1 创建归档

	tar  -cpvf  /PATH/TO/SOMEFILE.tar  FILE...
      c:创建打包文件,可搭配-v查看过程中被打包的档名
      v:将压缩/解压过程正在处理的文件名显示处理
      f:f后面要立刻接要被处理的档名,不可以再加参数,建议独立写
      p:保留备份数据的原本权限与属性
      p:(大写p)可以保留绝对目录压缩

7.2 追加文件至归档:不支持对压缩文件追加

	tar  -r –f  /PATH/TO/SOMEFILE.tar  FILE...

7.3 查看归档文件中的文件列表

	tar  -t –f  /PATH/TO/SOMEFILE.tar  FILE...

    例:仅解压单一文件
    第一步 过滤出来想要找的文件  tar -ztv -f etc.tar.gz |grep "shadow"
    第二步 根据档名解压  tar -zxv -f /data/etc.tar.gz etc/shadow

7.4 解压归档

	 tar  -x -r /PATH/TO/SOMEFILE.tar   
     tar  -x -r /PATH/TO/SOMEFILE.tar  -C /PATH/
     选项  -x:解开压缩文件的参数指令
          -C:大写C,解压到特定目录
压缩文件解压命令
*.tartar -xvf
*.gzgzip -d或gunzip
*.tar.gztar -xzf
*.bz2bzip2 -d或bunzip2
*.tar.bz3tar -xj
*.Zuncompress
*.tar.xztar -xJF

7.5 结合压缩工具实现:归档并压缩

	   -j:bzip2 ,   -z: gzip , -J:xz

例:备份/etc目录到/data目录下,使用tar命令,gzip压缩
    tar -zpcv -f /data/etc.tar.gz  /etc
PS:文件命名时,为了方便记忆,档名这里如果不加-z,-j,-J的话,取*.tar,j选项,取名为*.tar.bz2,选项z取名为*.tar.gz,选项J取名为*.tar.xz。

7.6 -exclude排除文件

 tar  zcvf /root/a3.tgz  --exclude=/app/host1  --exclude=/app/host2/app
 tar  zvcf  mybackup.tgz  -T /root/includefilelist X/root/excludefilelist
 选项:--exclude=   排除选项后的文件
			-T     选项指定输入需要打包的文件列表
	        -X     选项指定包含要排除的文件列表 
  PS:当需要排除或增加很多文件时,可以将需要打包的文件路径写入一个路径文件,利用-T和-X读取路径文件,一起操作

	例:打包/etc/sysconfig/,除去n开头的文件
    第一步:将n开头的文件重定向至ls /etc/sysconfig/n* -d > exclude.txt  
    第二步:将要打包的文件路径写入另一个读取目录list.txt
    tar zcvf sysconfig.tgz -T /data/line.txt  -X /data/exclude.txt
              生成的打包文件    打包的读取目录        排除的文件目录

8、cpio
功能:复制文件从或到归档
cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结尾的文件

	格式:cpio[选项]>文件名或者设备名
		 cpio[选项]<文件名或者设备名
	选项:
	   -o :将文件拷贝打包成文件或者将文件输出到设备上,需要重定向生成文件
	   -O :输出到指定的归档文件名
	   -A :向以存在的归档文件中追加文件
	   -i :解包,将打包文件解压或将设备上的备份还原到系统,标准输入的内容
	   -l :对指定的归档文件名解压
	   -t :预览,查看文件内容或者输出到设备上的文件内容
	   -F :使用指定的文件名代替标准输入或输出
	   -v :显示打包过程中的文件名称
	   -d :解包生成目录,在cpio还原时,自动的创立目录
	   -c :一种较新的存储方式

##三、分割文件

splist :分割一个文件为多个文件

格式:split  -b  Size  -d  tar-file-name  prefix-name
                           被分割文件      生成文件名
           -d 加上分割出来的文件名为01、02...
              不加分割出来的文件名为a、b、c...
例:split  -b  1M  -d  mybackup.tgz  mybackup-parts
   split  -b  1M  mybackup.tgz  mybackup-parts

合并:cat  mybackup-parts* >mybackup.tar.gz

##四、本章练习
1、查找/var目录下属主为root,且属组为mail的所有文件
[root@V9centos7 ]#find /var -user root -a -group mail
/var/spool/mail
2、查找/var目录下不属于root、postfix、gdm的所有文件
[root@V9centos7]#find /var ! ( -user root -o -user gdm -o -user postfix ) -ls
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
find /var -mtime -7 ! ( -user root -o -user postfix ) -ls
4、查找当前系统没有属主或属组,且最近一周内曾被访问过的文件
find / -nouser -o -nogroup -a -atime -7
5、查找/etc目录下大于1M且类型为普通文件的所有文件
find /etc -type f -size +1M
6、查找/etc目录下所有用户都没有写权限的文件
find /etc ! -perm /222 -ls
7、查找/etc目录下至少有一类用户没有执行权限的文件
find ! -perm -111 -ls
8、查找/etc/init.d目录下,所有用户都有执行权限,且其他用户有写权限的文件
find /etc/init.d -perm -113

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值