07linux查找(find,loate,xargs)和压缩

文件查找与压缩

•  在文件系统上查找符合条件的文件

•  文件查找:locate, find

非实时查找(数据库查找):locate 

实时查找:find

通常 find 不很常用因为速度慢之外, 还要读取磁盘,一般先使用 whereis或者是locate来检查,如 果找不到,一般才find命令来搜寻

whereis只找系统中某些特定目录下 面的文件,locate是利用数据库来搜寻文件名,两者就相当的快速,并且没有实 际的搜寻硬盘内的文件系统状态。

[root@centos6 app ]#whereis rm
rm: /bin/rm /usr/share/man/man1p/rm.1p.gz /usr/share/man/man1/rm.1.gz

一、文件查找

1、locate

        • 查询系统上预建的文件索引数据库

                /var/lib/mlocate/mlocate.db

        • 依赖于事先构建的索引

                索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库(updatedb)

        • 索引构建过程需要遍历整个根文件系统,极消耗资源

        • 工作特点:

        • 查找速度快

        • 模糊查找

         • 非实时查找 (更新数据库:updatedb即可实时查找)

        • 搜索的是文件的全路径,不仅仅是文件名

        • 可能只搜索用户具备读取和执行权限的目录

        • locate KEYWORD

        • 有用的选项

                – -i 不区分大小写的搜索         locate -i new.txt

                – -n N  只列举前N个匹配项目  locate -n 3 profile

                – -r 使用正则表达式             

        • 示例

        • 搜索名称或路径中带有“conf”的文件locate  conf

        • 使用Regex来搜索以“.conf”结尾的文件locate -r ‘\.conf$

            whatis 也是基于数据库

            [root@centos6 app ]#whatis ls
            ls                   (1)  - list directory contents
            ls                   (1p)  - list directory contents

        [root@centos6 app ]#locate -l 4 shadow
        /etc/gshadow
        /etc/gshadow-
        /etc/shadow
        /etc/shadow-

 

2、find 

        • 实时查找工具,通过遍历指定路径完成文件查找

        • 工作特点:

        • 查找速度略慢

        • 精确查找

        • 实时查找

        • 可能只搜索用户具备读取和执行权限的目录

        • 语法:

        • find  [OPTION]... [查找路径] [查找条件][处理动作]

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

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

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

            查找条件 

            指搜索层级

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

                -mindepthlevel 最小搜索目录深度



        •        根据文件名和inode查找:

                -name"文件名称":支持使用glob(通配符

                *,?, [], [^]

                -iname"文件名称":不区分字母大小写

                -inumn 按inode号查找   find  / -inum 2 -ls

                -samefilename 相同inode号的文件即:硬链接ln **

                -linksn 链接数为n的文件

                -regextypeposix-extended -regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

 ____________________________________________________________________________

     find 默认以当前路径查找

        find /etc -maxdepth 3 -mindepth 2  -name “network”

      find  -name “*.txt”  *代表通配符。双引号不可少。特殊符号的不加双引号可能报错

         [root@centos7 app ]#find /etc -name network*

find /root -regex "\.txt$"

find /etc/ -name "*.conf"2> find.error > find.right

[root@centos6 app ]#find /app -regextypeposix-extended -regex '/app/.(r..t)...\1er'

/app/aroot456rooter

[root@centos6 app ]#find -regextype posix-extended -regex './.(r..t)...\1er'

./aroot456rooter



        •        根据属主、属组查找:

            -userUSERNAME:查找属主为指定用户(UID)的文件

            -groupGRPNAME: 查找属组为指定组(GID)的文件

            -uidUserID:查找属主为指定的UID号的文件

            -gidGroupID:查找属组为指定的GID号的文件

            -nouser:查找没有属主的文件

            -nogroup:查找没有属组的文件

            __________________________________________________________________

            find/home -user dhy -name “*.sh”   通配符,也可以用正则表达式

            [root@centos7app ]#su hehe ;touch f1 ;exit; userdel -r hehe ;

 find -nouser   结果为f1

 


        •        根据文件类型查找:

                -type TYPE:

                • f: 普通文件

                • d: 目录文件

                • l: 符号链接文件

                • s:套接字文件

                • b: 块设备文件     存储数据

                • c: 字符设备文件   输出设备,如tty

                • p: 管道文件

             ————————————————————————————

                find/run -type s -ls  搜索套接字文件,-ls类似ls命令

                find-type d 默认搜索当前目录下的目录

 



          •        组合条件:

                与:-a

                或:-o

                非:-not, !

            ————————————————————————————

                find/home -user wang  -name "*.sh" 默认为并且的关系(-a) 搜索User为wang的文件且文件名为.sh的文件

              find  /home -user  wang  !  -name “*.sh” 是wang的文件,但不以.sh结尾

              find  /home ! \( -user wang -o  -name “*.sh” \) 不是wang也不是.sh结尾的文件




        • 德·摩根定律:

                (非 A) 或 (非 B) = 非(A 且 B)

                (非 A) 且 (非 B) = 非(A 或 B)

        • 示例:

                !A-a !B = !(A -o B)

                !A-o !B = !(A -a B)

            • find -namesnow.png

            • find -inamesnow.png

            • find /-name   “*.txt”

            • find /var –name “*log*”

            • find -user joe-group joe

            • find -user joe-not -group joe

            • find -user joe-o -user jane

            • find -not \(-user joe -o -user jane \) 不是joe也不是jane的

            • find / -user joe-o -uid 500

            • 找出/tmp目录下,属主不是root,且文件名不以f开头的文件

                    find/tmp \( -not -user root -a -not-name 'f*' \) -ls

                    find/tmp -not \( -user root -o -name'f*' \) –ls



            • 排除目录

            • 示例:

                查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件

                find /etc-path ‘/etc/sane.d’ -a -prune -o -name “*.conf”

                                        prune是剪切的意思,此处表示排除,-a是且的关系

        查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的其它所有.conf后缀的文件

        注意(  f  )小括号必须与字符间有空格,否则报错

 


            查找条件

        • 根据文件大小来查找:

            -size[+|-]#UNIT

            常用单位:k, M, G,c(byte)

             #UNIT:(#-1, #]

                    如:6k 表示(5k,6k]

            -#UNIT:[0,#-1]

                    如:-6k 表示[0,5k]

            +#UNIT:(#,∞)

                    如:+6k 表示(6k,∞)

         ————————————————————————————

            dd if =/dev/zero  of =f1 bs=1 count=1024

            find-size 2k   表示1k到2k 不包含1k

            find-size 2048c  表示2047字节到2048字节

            find / -size +50M -size-101M  表示查找50M到100M 不包含50M



        查找条件

        • 根据时间戳:

         以“天”为单位;

                -atime[+|-]#,

                #:[#,#+1)

                +#:[#+1,∞]  

                -#:[0,#)      过去一周内 -7

                -mtime

              -ctime

          以“分钟”为单位:

                -amin

                -mmin

                -cmin

——————————————————————————

[root@study ~]# find [PATH] [option] [action] 选项与参数: 
1\. 与时间有关的选项:共有 -atime, -ctime -mtime ,以 -mtime 说明
-mtime n :n 为数字,意义为在 n 天之前的“一天之内”被更动过内容的文件;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件文件名;
-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件文件名。
-newer file :file 为一个存在的文件,列出比 file 还要新的文件文件名


范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出 
[root@study ~]# find / -mtime
# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前, 
# 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内? 
# find / -mtime 3 有变动过的文件都被列出的意思!


范例二:寻找 /etc 下面的文件,如果文件日期比 /etc/passwd 新就列出 
[root@study ~]# find /etc -newer /etc/passwd 
# -newer 用在分辨两个文件之间的新旧关系是很有用的!
07linux查找(find,loate,xargs)和压缩_第1张图片

时间参数真是挺有意思的!我们现在知道 atime, ctime mtime 的意义,如果你想要找出一 天内被更动过的文件名称, 可以使用上述范例一的作法。但如果我想要找出“4天内被更动过 的文件文件名”呢?那可以使用“ find /var -mtime -4 ”。那如果是“4天前的那一天”就用“ find /var -mtime 4 ”。有没有加上“+, -”差别很大喔!我们可以用简单的图示来说明一下:


图6.5.1、find 相关的时间参数意义
图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图 6.5.1 我们可以清楚的 知道:
+4代表大于等于5天前的文件名:ex> find /var -mtime +4 
-4代表小于等于4天内的文件文件名:ex> find /var -mtime -4 
4则是代表4-5那一天的文件文件名:ex> find /var -mtime 4

—————————上述find查找时间来自鸟哥的linux私房菜第4版第331页——




        • 根据权限查找:

                -perm[/|-]MODE

                MODE:精确权限匹配

                /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘汰

                -MODE:每一类对象都必须同时拥有指定权限,与关系

                0表示不关注

                • find -perm 755 会匹配权限模式恰好是755的文件

                • 只要当任意人有写权限时,find-perm +222就会匹配

                • 只有当每个人都有写权限时,find-perm -222才会匹配

                • 只有当其它人(other)有写权限时,find -perm -002才会匹配

                 ———————————————————————————

                find-perm /600 600是或的关系。600中的6可以是r,rw,w,也是或关系。即r,rw,w三种满足一个即可

                find-perm -600  600 3位是且的关系,6必须是rw,也是且

 



        处理动作

            • -print:默认的处理动作,显示至屏幕

            • -ls:类似于对查找到的文件执行“ls-l”命令

            • -delete:删除查找到的文件

            • -fls file:查找到的所有文件的长格式信息保存至指定文件中

            • -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认

            •  -exec COMMAND {}  \; 对查找到的每个文件执行由COMMAND指定的命令

            • {}: 用于引用查找到的文件名称自身

            • find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令

 

 二、   参数替换xargs

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

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

            • 注意:文件名或者是其他意义的名词内含有空格符的情况

            • 有些命令不能接受过多参数,命令执行可能会失败,xargs可以解决

            • 示例:

            ls f* |xargs   rm

            find  /sbin -perm +700 |ls -l  这个命令是错误的

            find /sbin -perm +7000 | xargs ls –l

            • find和xargs格式:find | xargs COMMAND

             ___________________________________________________________________

            find  -exec rm {} \ 是一个一个删除,比较慢,ls * | xargs rm 较快

            find示例

            • find  -name“*.conf” -exec cp{} {}.orig \;   备份配置文件,添加.orig这个扩展名

            • find /tmp -ctime+3 -user joe -ok rm {} \;  提示删除存在时间超过3天以上的joe的临时文件

            • find ~ -perm-002 -exec chmod o-w {} \; 在你的主目录中寻找可被其它用户写入的文件

            • find /data –type  f -perm 644-name “*.sh” –exec chmod 755 {} \;  把/data目录下以.sh结尾的普通文件且权限是644的文件。替换为权限为755

            • find  /home–type d -ls

      如下示例:在整个文件系统中,找出所有归属于dhy用户的文件并复制到/root/findresults目录

      

 1、查找/var目录下属主为root,且属组为mail的所有文件
find /var/ -user root -group mail
2、查找/var目录下不属于root、lp、gdm的所有文件
find /var -not \( -user root -o -user lp -o -user gdm \) 
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
find /var -mtime -7 -not \( -user root -o -user postfix \)

 



三、打包压缩

•  file-roller

•  compress/uncompress: .Z

•  gzip/gunzip: .gz

•  bzip2/bunzip2: .bz2

•  xz/unxz: .xz

•  zip/unzip

•  tar

•  cpio

 

 1、 compress/uncompress

 

•  compress [-dfvcVr] [-bmaxbits] [file ...]

-d: 解压缩,相当于uncompress 默认只识别.Z

-c: 结果输出至标准输出,不删除原文件

-v: 显示详情

•  uncompress  解压缩

•  zcat file.Z >file

_________________________________________________

compress -c passwd > f1.X  f1.X和passwd权限不一样,>是新建文件

 compress 压缩后源文件丢失

    type 查看压缩比


 2、gzip/gunzip

•  gzip [OPTION]... FILE ...

-d: 解压缩,相当于gunzip    只识别.gz结尾的文件

-c: 将压缩或解压缩的结果输出至标准输出,不删除原文件

-#:1-9,指定压缩比,值越大压缩比越大 默认是6

•  zcat:不显式解压缩的前提下查看文本文件内容

•  实例:

gzip -c messages >messages.gz   >丢失权限,默认权限有umask计算

gzip -c -d messages.gz > messages

zcat messages.gz > messages

——————————————————————————

gzip压缩后源文件丢失,只有压缩包

 

3、bzip2/bunzip2/bzcat

•  bzip2 [OPTION]... FILE ...

-k: keep, 保留原文件

-d:解压缩                     识别bzip2结尾或者其它结尾的文件(加.out)

-#:1-9,压缩比,默认为9

•  bzcat:不显式解压缩的前提下查看文本文件内容或者-c

-v 显示详细信息

 


4、xz/unxz/xzcat

•  xz [OPTION]... FILE ...

-k: keep, 保留原文件

-d:解压缩

-#:1-9,压缩比,默认为6

•  xzcat: 不显式解压缩的前提下查看文本文件内容



5、zip/unzip

•  打包压缩

zip –r/testdir/sysconfig  /etc/sysconfig/

•  解包解压缩

unzip sysconfig.zip

cat /var/log/messages | zip messages   -

unzip -p message > message

 

四、tar工具

tar打包,需配合上述压缩工具

•  Tar(TapeARchive,磁带归档的缩写)

•  tar [OPTION]...

(1)   创建归档

tar -c -f /PATH/TO/SOMEFILE.tar FILE...              -c创建文件,若有-f选项,后面必须跟文件

(2)   追加文件至归档: 注:不支持对压缩文件追加

tar   -r -f /PATH/TO/SOMEFILE.tar FILE...          -r递归

(3)   查看归档文件中的文件列表

tar -t -f /PATH/TO/SOMEFILE.tar                   -t查看

(4)   展开归档

tar -x -f /PATH/TO/SOMEFILE.tar            -x 展开包

tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/    -C展开包到指定路径/PATH/

(5)   结合压缩工具实现:归档并压缩

-j: bzip2, -z: gzip,-J: xz  下面tar打包,再加上压缩功能

 ——————————————————————

tar -zcvf etc.bak  /etc -C /tmp

 -z表示gzip压缩方式,v显示打包压缩具体详细过程。打包压缩的文件见名知意,etc.bak.z较好

tar工具

•  -T选项指定输入文件,-X选项指定包含要排除的文件列表

tar zcvf mybackup.tgz -T /root/includefilelist -X/root/excludefilelist

•  分割大的tar 文件为多份小文件:

split  –b Size –d tar-file-name   prefix-name

split  -b 1M –d mybackup.tgz mybackup-parts  把打包压缩的包mybackup,tgz分成mybackup-parts为前缀的多个包名

split  -b 1M mybackup.tgz mybackup-parts

 split -b size 要拆分的包   拆分包名前缀

•  合并:

 拆分的包,要合并才能查看

cat mybackup-parts* > mybackup.tar.gz

 ————————————————————————————————

 


五、cpio

•  功能:复制文件从或到归档

•  cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或  者“.tar”结尾的文件

•  cpio [选项] > 文件名或者设备名

•  cpio [选项] < 文件名或者设备名

•  选项

-o 将文件拷贝打包成文件或者将文件输出到设备上

-i 解包,将打包文件解压或将设备上的备份还原到系统

-t 预览,查看文件内容或者输出到设备上的文件内容

-v 显示打包过程中的文件名称。

-d 解包生成目录,在cpio还原时,自动的建立目录

-c 一种较新的存储方式

 

示例

•  将etc目录备份:

find ./etc -print |cpio -ov >etc.cpio

•  内容预览

cpio –tv < etc.cpio

•  解包文件

cpio –idv < etc.cpio

 


你可能感兴趣的:(linux)