十六. 文件查找命令find:



    下面给出find命令的主要应用示例:

    /> ls -l     #列出当前目录下所包含的测试文件

    -rw-r--r--. 1 root root 48217 Nov 12 00:57 install.log

    -rw-r--r--. 1 root root      37 Nov 12 00:56 testfile.dat

    -rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2

    -rw-r--r--. 1 root root     183 Nov 11 08:02 users

    -rw-r--r--. 1 root root     279 Nov 11 08:45 users2

    

    1. 按文件名查找:

    -name:  查找时文件名大小写敏感。

    -iname: 查找时文件名大小写不敏感。

    #该命令为find命令中最为常用的命令,即从当前目录中查找扩展名为.log的文件。需要说明的是,缺省情况下,find会从指定的目录搜索,并递归的搜索其子目录。

    /> find . -name "*.log"

     ./install.log

    /> find . -iname U*          #如果执行find . -name U*将不会找到匹配的文件

    users users2

2. 按文件时间属性查找:

    -atime  -n[+n]: 找出文件访问时间在n日之内[之外]的文件。

    -ctime  -n[+n]: 找出文件更改时间在n日之内[之外]的文件。

    -mtime -n[+n]: 找出修改数据时间在n日之内[之外]的文件。

    -amin   -n[+n]: 找出文件访问时间在n分钟之内[之外]的文件。

    -cmin   -n[+n]: 找出文件更改时间在n分钟之内[之外]的文件。

    -mmin  -n[+n]: 找出修改数据时间在n分钟之内[之外]的文件。

    /> find -ctime -2        #找出距此时2天之内创建的文件

    .

    ./users2

    ./install.log

    ./testfile.dat

    ./users

    ./test.tar.bz2

    /> find -ctime +2        #找出距此时2天之前创建的文件

    没有找到                     #因为当前目录下所有文件都是2天之内创建的

    /> touch install.log     #手工更新install.log的最后访问时间,以便下面的find命令可以找出该文件

    /> find . -cmin  -3       #找出修改状态时间在3分钟之内的文件。

    install.log



    3. 基于找到的文件执行指定的操作:

    -exec: 对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \;,注意{}和\;之间的空格,同时两个{}之间没有空格

    -ok:   其主要功能和语法格式与-exec完全相同,唯一的差别是在于该选项更加安全,因为它会在每次执行shell命令之前均予以提示,只有在回答为y的时候,其后的shell命令才会被继续执行。需要说明的是,该选项不适用于自动化脚本,因为该提供可能会挂起整个自动化流程。

    #找出距此时2天之内创建的文件,同时基于find的结果,应用-exec之后的命令,即ls -l,从而可以直接显示出find找到文件的明显列表。

    /> find . -ctime -2 -exec ls -l {} \;

    -rw-r--r--. 1 root root      279 Nov 11 08:45 ./users2

    -rw-r--r--. 1 root root  48217 Nov 12 00:57 ./install.log

    -rw-r--r--. 1 root root        37 Nov 12 00:56 ./testfile.dat

    -rw-r--r--. 1 root root      183 Nov 11 08:02 ./users

    -rw-r--r--. 1 root root  10530 Nov 11 23:08 ./test.tar.bz2

    #找到文件名为*.log, 同时文件数据修改时间距此时为1天之内的文件。如果找到就删除他们。有的时候,这样的写法由于是在找到之后立刻删除,因此存在一定误删除的危险。

    /> ls

    install.log  testfile.dat  test.tar.bz2  users  users2

    /> find . -name "*.log" -mtime -1 -exec rm -f {} \; 

    /> ls

    testfile.dat  test.tar.bz2  users  users2

    在控制台下,为了使上面的命令更加安全,我们可以使用-ok替换-exec,见如下示例:

    />  find . -name "*.dat" -mtime -1 -ok rm -f {} \;

    < rm ... ./testfile.dat > ? y    #对于该提示,如果回答y,找到的*.dat文件将被删除,这一点从下面的ls命令的结果可以看出。

    /> ls

    test.tar.bz2  users  users2



    4. 按文件所属的owner和group查找:

    -user:      查找owner属于-user选项后面指定用户的文件。

    ! -user:    查找owner不属于-user选项后面指定用户的文件。

    -group:   查找group属于-group选项后面指定组的文件。

    ! -group: 查找group不属于-group选项后面指定组的文件。

    /> ls -l                            #下面三个文件的owner均为root

    -rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2

    -rw-r--r--. 1 root root     183 Nov 11 08:02 users

    -rw-r--r--. 1 root root     279 Nov 11 08:45 users2

    /> chown stephen users   #将users文件的owner从root改为stephen。

    /> ls -l

    -rw-r--r--. 1 root       root 10530 Nov 11 23:08 test.tar.bz2

    -rw-r--r--. 1 stephen root    183 Nov 11 08:02 users

    -rw-r--r--. 1 root       root     279 Nov 11 08:45 users2

    /> find . -user root          #搜索owner是root的文件

    .

    ./users2

    ./test.tar.bz2

    /> find . ! -user root        #搜索owner不是root的文件,注意!和-user之间要有空格。

    ./users

    /> ls -l                            #下面三个文件的所属组均为root

    -rw-r--r--. 1 root      root 10530 Nov 11 23:08 test.tar.bz2

    -rw-r--r--. 1 stephen root    183 Nov 11 08:02 users

    -rw-r--r--. 1 root      root    279 Nov 11 08:45 users2

    /> chgrp stephen users    #将users文件的所属组从root改为stephen

    /> ls -l

    -rw-r--r--. 1 root           root    10530 Nov 11 23:08 test.tar.bz2

    -rw-r--r--. 1 stephen stephen      183 Nov 11 08:02 users

    -rw-r--r--. 1 root            root       279 Nov 11 08:45 users2

    /> find . -group root        #搜索所属组是root的文件

    .

    ./users2

    ./test.tar.bz2

    /> find . ! -group root      #搜索所属组不是root的文件,注意!和-user之间要有空格。    

    ./users



    5. 按指定目录深度查找:

    -maxdepth: 后面的参数表示距当前目录指定的深度,其中1表示当前目录,2表示一级子目录,以此类推。在指定该选项后,find只是在找到指定深度后就不在递归其子目录了。下例中的深度为1,表示只是在当前子目录中搜索。如果没有设置该选项,find将递归当前目录下的所有子目录。

    /> mkdir subdir               #创建一个子目录,并在该子目录内创建一个文件

    /> cd subdir

    /> touch testfile

    /> cd ..

    #maxdepth后面的参数表示距当前目录指定的深度,其中1表示当前目录,2表示一级子目录,以此类推。在指定该选项后,find只是在找到指定深度后就不在递归其子目录了。下例中的深度为1,表示只是在当前子目录中搜索。如果没有设置该选项,find将递归当前目录下的所有子目录。

    /> find . -maxdepth 1 -name "*"

    .

    ./users2

    ./subdir

    ./users

    ./test.tar.bz2

    #搜索深度为子一级子目录,这里可以看出子目录下刚刚创建的testfile已经被找到

    /> find . -maxdepth 2 -name "*"  

    .

    ./users2

    ./subdir

    ./subdir/testfile

    ./users

    ./test.tar.bz2

    

    6. 排除指定子目录查找:

    -path pathname -prune:   避开指定子目录pathname查找。

    -path expression -prune:  避开表达中指定的一组pathname查找。

    需要说明的是,如果同时使用-depth选项,那么-prune将被find命令忽略。

    #为后面的示例创建需要避开的和不需要避开的子目录,并在这些子目录内均创建符合查找规则的文件。

    /> mkdir DontSearchPath  

    /> cd DontSearchPath

    /> touch datafile1

    /> cd ..

    /> mkdir DoSearchPath

    /> cd DoSearchPath

    /> touch datafile2

    /> cd ..

    /> touch datafile3

    #当前目录下,避开DontSearchPath子目录,搜索所有文件名为datafile*的文件。

    /> find . -path "./DontSearchPath" -prune -o -name "datafile*" -print

    ./DoSearchPath/datafile2

    ./datafile3

    #当前目录下,同时避开DontSearchPath和DoSearchPath两个子目录,搜索所有文件名为datafile*的文件。

    /> find . \( -path "./DontSearchPath" -o -path "./DoSearchPath" \) -prune -o -name "datafile*" -print

    ./datafile3

        

    7. 按文件权限属性查找:

    -perm mode:   文件权限正好符合mode(mode为文件权限的八进制表示)。

    -perm +mode: 文件权限部分符合mode。如命令参数为644(-rw-r--r--),那么只要文件权限属性中有任何权限和644重叠,这样的文件均可以被选出。

    -perm -mode:  文件权限完全符合mode。如命令参数为644(-rw-r--r--),当644中指定的权限已经被当前文件完全拥有,同时该文件还拥有额外的权限属性,这样的文件可被选出。

    /> ls -l

    -rw-r--r--. 1 root            root           0 Nov 12 10:02 datafile3

    -rw-r--r--. 1 root            root    10530 Nov 11 23:08 test.tar.bz2

    -rw-r--r--. 1 stephen stephen        183 Nov 11 08:02 users

    -rw-r--r--. 1 root            root        279 Nov 11 08:45 users2

    /> find . -perm 644      #查找所有文件权限正好为644(-rw-r--r--)的文件。

    ./users2

    ./datafile3

    ./users

    ./test.tar.bz2

    /> find . -perm 444      #当前目录下没有文件的权限属于等于444(均为644)。    

    /> find . -perm -444     #644所包含的权限完全覆盖444所表示的权限。

    .

    ./users2

    ./datafile3

    ./users

    ./test.tar.bz2

    /> find . -perm +111    #查找所有可执行的文件,该命令没有找到任何文件。

    /> chmod u+x users     #改变users文件的权限,添加owner的可执行权限,以便于下面的命令可以将其找出。

    /> find . -perm +111     

    .

    ./users    

    

    8. 按文件类型查找:

    -type:后面指定文件的类型。

    b - 块设备文件。

    d - 目录。

    c - 字符设备文件。

    p - 管道文件。

    l  - 符号链接文件。

    f  - 普通文件。

    /> mkdir subdir 

    /> find . -type d      #在当前目录下,找出文件类型为目录的文件。

    ./subdir

  /> find . ! -type d    #在当前目录下,找出文件类型不为目录的文件。

    ./users2

    ./datafile3

    ./users

    ./test.tar.bz2

    /> find . -type f       #在当前目录下,找出文件类型为文件的文件

    ./users2

    ./datafile3

    ./users

    ./test.tar.bz2

    

    9. 按文件大小查找:

    -size [+/-]100[c/k/M/G]: 表示文件的长度为等于[大于/小于]100块[字节/k/M/G]的文件。

    -empty: 查找空文件。

    /> find . -size +4k -exec ls -l {} \;  #查找文件大小大于4k的文件,同时打印出找到文件的明细

    -rw-r--r--. 1 root root 10530 Nov 11 23:08 ./test.tar.bz2

    /> find . -size -4k -exec ls -l {} \;  #查找文件大小小于4k的文件。

    -rw-r--r--. 1 root            root 279 Nov 11 08:45 ./users2

    -rw-r--r--. 1 root             root    0 Nov 12 10:02 ./datafile3

    -rwxr--r--. 1 stephen stephen 183 Nov 11 08:02 ./users

    /> find . -size 183c -exec ls -l {} \; #查找文件大小等于183字节的文件。

    -rwxr--r--. 1 stephen stephen 183 Nov 11 08:02 ./users

    /> find . -empty  -type f -exec ls -l {} \;

    -rw-r--r--. 1 root root 0 Nov 12 10:02 ./datafile3

    

    10. 按更改时间比指定文件新或比文件旧的方式查找:

    -newer file1 ! file2: 查找文件的更改日期比file1新,但是比file2老的文件。

    /> ls -lrt   #以时间顺序(从早到晚)列出当前目录下所有文件的明细列表,以供后面的例子参考。

    -rwxr--r--. 1 stephen stephen   183 Nov 11 08:02 users1

    -rw-r--r--. 1 root           root    279 Nov 11 08:45 users2

    -rw-r--r--. 1 root           root 10530 Nov 11 23:08 test.tar.bz2

    -rw-r--r--. 1 root           root        0 Nov 12 10:02 datafile3

    /> find . -newer users1     #查找文件更改日期比users1新的文件,从上面结果可以看出,其余文件均符合要求。

    ./users2

    ./datafile3

    ./test.tar.bz2

    /> find . ! -newer users2   #查找文件更改日期不比users1新的文件。

    ./users2

    ./users

    #查找文件更改日期比users2新,但是不比test.tar.bz2新的文件。

    /> find . -newer users2 ! -newer test.tar.bz2

    ./test.tar.bz2

    

    细心的读者可能发现,关于find的说明,在我之前的Blog中已经给出,这里之所以拿出一个小节再次讲述该命令主要是因为以下三点原因:

    1. find命令在Linux Shell中扮演着极为重要的角色;

    2. 为了保证本系列的完整性;

    3. 之前的Blog是我多年之前留下的总结笔记,多少有些粗糙,这里给出了更为详细的举例。

十七. xargs命令:



    该命令的主要功能是从输入中构建和执行shell命令。       

    在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。  

    find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。  

    在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;  

    而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

    /> ls -l

    -rw-r--r--. 1 root root        0 Nov 12 10:02 datafile3

    -rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2

    -rwxr--r--. 1 root root    183 Nov 11 08:02 users

    -rw-r--r--. 1 root root    279 Nov 11 08:45 users2

    #查找当前目录下的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件。

    /> find . -type f -print | xargs file 

    ./users2:        ASCII text

    ./datafile3:      empty

    ./users:          ASCII text

    ./test.tar.bz2: bzip2 compressed data, block size = 900k

    #回收当前目录下所有普通文件的执行权限。

    /> find . -type f -print | xargs chmod a-x

    /> ls -l

    -rw-r--r--. 1 root root     0 Nov 12 10:02 datafile3

    -rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2

    -rw-r--r--. 1 root root   183 Nov 11 08:02 users

    -rw-r--r--. 1 root root   279 Nov 11 08:45 users2

    #在当面目录下查找所有普通文件,并用grep命令在搜索到的文件中查找hostname这个词

    /> find . -type f -print | xargs grep "hostname" 

    #在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中。

    /> find / -name "core" -print | xargs echo "" >/tmp/core.log  

/> pgrep mysql | xargs kill -9  #直接杀掉mysql的进程

    [1]+  Killed                  mysql


linux 6-find,xargs的更多相关文章

  1. 【Linux】- 对find,xargs,grep和管道的一些理解

    问题 相信大家都知道在目录中搜索含有固定字符串文件的命令: find . -name '*.py' |xargs grep test 刚开始的时候,我不熟悉xargs命令,所以直接使用的命令是: fi ...

  2. [转帖]xargs命令详解,xargs与管道的区别

    xargs命令详解,xargs与管道的区别 https://www.cnblogs.com/wangqiguo/p/6464234.html 之前一直说要学习一下 xargs 到现在为止也没学习.. ...

  3. [转帖]50个必知的Linux命令技巧,你都掌握了吗?

    50个必知的Linux命令技巧,你都掌握了吗? https://blog.51cto.com/lizhenliang/2131141 https://blog.51cto.com/lizhenlian ...

  4. Python模拟Linux的Crontab, 写个任务计划需求

    Python模拟Linux的Crontab, 写个任务计划需求 来具体点 需求: 执行一个程序, 程序一直是运行状态, 这里假设是一个函数 当程序运行30s的时候, 需要终止程序, 可以用python ...

  5. linux命令详解——xargs

    1. 简介 之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如: find /sbin -perm +700 |ls -l     ...

  6. 【Linux常见命令】xargs命令

    xargs - build and execute command lines from standard input. 从标准输入< 方向获取数据,再创建和执行命令 xargs 是给命令传递参 ...

  7. Linux 参数代换 命令 xargs

    xargs 命令也是管道命令中的一员.xargs命令的功能简单来说就是参数代换.那么什么叫做参数代换,这里首先要了解管道的概念.在 linux管道 命令一节中我们详细介绍了管道命令的概念.这里我们只是 ...

  8. 快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础

    上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是W ...

  9. windows / linux系统中,端口被占用解决方法

    一.在windows操作系统中,查询端口占用和清除端口占用的程序 提升权限后用:netstat -b或用 1.查询端口占用的进程ID 点击"开始"-->"运行&qu ...

  10. 初探linux内核编程,参数传递以及模块间函数调用

    一.前言                                  我们一起从3个小例子来体验一下linux内核编程.如下: 1.内核编程之hello world 2.模块参数传递 3.模块间 ...

随机推荐

  1. python 赋值 深浅拷贝

    深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 impor ...

  2. JSP 基于Oracle分页

    booklist.jsp <%@page import="books.accp.utils.Pager"%> <%@page import="books ...

  3. Linux(Centos)——下升级python3.3

    CentOS下的Python版本一般都比较低,很多应用都需要升级python来完成.我装的centOS的默认的python版本是V2.4.3,但运行node.js需要的版本是2.5以上. 1.下载py ...

  4. Spring IOC源代码具体解释之容器初始化

    Spring IOC源代码具体解释之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比較典型的代码 ClassPathResource res = new C ...

  5. ListView知识点汇总(9.2)

    1 最为基础的listview: http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html http://blog.csdn.net/h ...

  6. ssh隧道远程连接mysql

    有时候比如一些云主机,没有开放3306端口,这里可以用ssh隧道来连接数据库,更加安全 注意点: 1.本地ssh可以登录远程服务器,(密码或者秘钥) 2.远程数据库需要赋权限给隧道端的ip 命令: s ...

  7. Java交通灯系统

    交通灯管理项目模拟了对十字路口交通灯的控制,一般在我们生活中的十字路口是有人行道的,而此项目没有考虑人行道.具体需求如下:  1.异步随机生成按照各个路线行驶的车辆.          例如:     ...

  8. 实际项目中,看 ECharts 和 HighCharts 渲染性能对比,表面看衣装,本质看内功!!!

    最近做项目,使用的是echarts显示图表数据,但是数据量比较多的时候,有卡顿的情况.后来同事拿echarts和HighCharts做了对比,仅供大家参考.同时感谢同事做的工作. 一.查询1天的源数据 ...

  9. lua学习笔记(十三)

    math库     定义在math中     所有三角函数都使用弧度     指数和对数函数     取整函数     伪随机数math.random         调用时没有参数返回0~1之间的随 ...

  10. Unity2D实现人物三连击

    之前写过一个系列<HTML5 2D平台游戏开发>,在此过程中发现有很多知识点没有掌握,而且用纯JavaScript来开发一个游戏效率极低,因为调试与地图编辑都没有可视化的工具,开发起来费时 ...