找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4335|回复: 0

Linux Shell常用技巧(七)

[复制链接]
发表于 2012-4-21 10:19:40 | 显示全部楼层 |阅读模式
  1. 十六. 文件查找命令find:
  2.     下面给出find命令的主要应用示例:
  3.     /> ls -l     #列出当前目录下所包含的测试文件
  4.     -rw-r--r--. 1 root root 48217 Nov 12 00:57 install.log
  5.     -rw-r--r--. 1 root root      37 Nov 12 00:56 testfile.dat
  6.     -rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2
  7.     -rw-r--r--. 1 root root     183 Nov 11 08:02 users
  8.     -rw-r--r--. 1 root root     279 Nov 11 08:45 users2
  9.    
  10.     1. 按文件名查找:
  11.     -name:  查找时文件名大小写敏感。
  12.     -iname: 查找时文件名大小写不敏感。
  13.     #该命令为find命令中最为常用的命令,即从当前目录中查找扩展名为.log的文件。需要说明的是,缺省情况下,find会从指定的目录搜索,并递归的搜索其子目录。
  14.     /> find . -name "*.log"
  15.      ./install.log
  16.     /> find . -iname U*          #如果执行find . -name U*将不会找到匹配的文件
  17.     users users2
  18.     2. 按文件时间属性查找:
  19.     -atime  -n[+n]: 找出文件访问时间在n日之内[之外]的文件。
  20.     -ctime  -n[+n]: 找出文件更改时间在n日之内[之外]的文件。
  21.     -mtime -n[+n]: 找出修改数据时间在n日之内[之外]的文件。
  22.     -amin   -n[+n]: 找出文件访问时间在n分钟之内[之外]的文件。
  23.     -cmin   -n[+n]: 找出文件更改时间在n分钟之内[之外]的文件。
  24.     -mmin  -n[+n]: 找出修改数据时间在n分钟之内[之外]的文件。
  25.     /> find -ctime -2        #找出距此时2天之内创建的文件
  26.     .
  27.     ./users2
  28.     ./install.log
  29.     ./testfile.dat
  30.     ./users
  31.     ./test.tar.bz2
  32.     /> find -ctime +2        #找出距此时2天之前创建的文件
  33.     没有找到                     #因为当前目录下所有文件都是2天之内创建的
  34.     /> touch install.log     #手工更新install.log的最后访问时间,以便下面的find命令可以找出该文件
  35.     /> find . -cmin  -3       #找出修改状态时间在3分钟之内的文件。
  36.     install.log
  37.     3. 基于找到的文件执行指定的操作:
  38.     -exec: 对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \;,注意{}和\;之间的空格,同时两个{}之间没有空格
  39.     -ok:   其主要功能和语法格式与-exec完全相同,唯一的差别是在于该选项更加安全,因为它会在每次执行shell命令之前均予以提示,只有在回答为y的时候,其后的shell命令才会被继续执行。需要说明的是,该选项不适用于自动化脚本,因为该提供可能会挂起整个自动化流程。
  40.     #找出距此时2天之内创建的文件,同时基于find的结果,应用-exec之后的命令,即ls -l,从而可以直接显示出find找到文件的明显列表。
  41.     /> find . -ctime -2 -exec ls -l {} \;
  42.     -rw-r--r--. 1 root root      279 Nov 11 08:45 ./users2
  43.     -rw-r--r--. 1 root root  48217 Nov 12 00:57 ./install.log
  44.     -rw-r--r--. 1 root root        37 Nov 12 00:56 ./testfile.dat
  45.     -rw-r--r--. 1 root root      183 Nov 11 08:02 ./users
  46.     -rw-r--r--. 1 root root  10530 Nov 11 23:08 ./test.tar.bz2
  47.     #找到文件名为*.log, 同时文件数据修改时间距此时为1天之内的文件。如果找到就删除他们。有的时候,这样的写法由于是在找到之后立刻删除,因此存在一定误删除的危险。
  48.     /> ls
  49.     install.log  testfile.dat  test.tar.bz2  users  users2
  50.     /> find . -name "*.log" -mtime -1 -exec rm -f {} \;
  51.     /> ls
  52.     testfile.dat  test.tar.bz2  users  users2
  53.     在控制台下,为了使上面的命令更加安全,我们可以使用-ok替换-exec,见如下示例:
  54.     />  find . -name "*.dat" -mtime -1 -ok rm -f {} \;
  55.     < rm ... ./testfile.dat > ? y    #对于该提示,如果回答y,找到的*.dat文件将被删除,这一点从下面的ls命令的结果可以看出。
  56.     /> ls
  57.     test.tar.bz2  users  users2
  58.     4. 按文件所属的owner和group查找:
  59.     -user:      查找owner属于-user选项后面指定用户的文件。
  60.     ! -user:    查找owner不属于-user选项后面指定用户的文件。
  61.     -group:   查找group属于-group选项后面指定组的文件。
  62.     ! -group: 查找group不属于-group选项后面指定组的文件。
  63.     /> ls -l                            #下面三个文件的owner均为root
  64.     -rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2
  65.     -rw-r--r--. 1 root root     183 Nov 11 08:02 users
  66.     -rw-r--r--. 1 root root     279 Nov 11 08:45 users2
  67.     /> chown stephen users   #将users文件的owner从root改为stephen。
  68.     /> ls -l
  69.     -rw-r--r--. 1 root       root 10530 Nov 11 23:08 test.tar.bz2
  70.     -rw-r--r--. 1 stephen root    183 Nov 11 08:02 users
  71.     -rw-r--r--. 1 root       root     279 Nov 11 08:45 users2
  72.     /> find . -user root          #搜索owner是root的文件
  73.     .
  74.     ./users2
  75.     ./test.tar.bz2
  76.     /> find . ! -user root        #搜索owner不是root的文件,注意!和-user之间要有空格。
  77.     ./users
  78.     /> ls -l                            #下面三个文件的所属组均为root
  79.     -rw-r--r--. 1 root      root 10530 Nov 11 23:08 test.tar.bz2
  80.     -rw-r--r--. 1 stephen root    183 Nov 11 08:02 users
  81.     -rw-r--r--. 1 root      root    279 Nov 11 08:45 users2
  82.     /> chgrp stephen users    #将users文件的所属组从root改为stephen
  83.     /> ls -l
  84.     -rw-r--r--. 1 root           root    10530 Nov 11 23:08 test.tar.bz2
  85.     -rw-r--r--. 1 stephen stephen      183 Nov 11 08:02 users
  86.     -rw-r--r--. 1 root            root       279 Nov 11 08:45 users2
  87.     /> find . -group root        #搜索所属组是root的文件
  88.     .
  89.     ./users2
  90.     ./test.tar.bz2
  91.     /> find . ! -group root      #搜索所属组不是root的文件,注意!和-user之间要有空格。   
  92.     ./users
  93.     5. 按指定目录深度查找:
  94.     -maxdepth: 后面的参数表示距当前目录指定的深度,其中1表示当前目录,2表示一级子目录,以此类推。在指定该选项后,find只是在找到指定深度后就不在递归其子目录了。下例中的深度为1,表示只是在当前子目录中搜索。如果没有设置该选项,find将递归当前目录下的所有子目录。
  95.     /> mkdir subdir               #创建一个子目录,并在该子目录内创建一个文件
  96.     /> cd subdir
  97.     /> touch testfile
  98.     /> cd ..
  99.     #maxdepth后面的参数表示距当前目录指定的深度,其中1表示当前目录,2表示一级子目录,以此类推。在指定该选项后,find只是在找到指定深度后就不在递归其子目录了。下例中的深度为1,表示只是在当前子目录中搜索。如果没有设置该选项,find将递归当前目录下的所有子目录。
  100.     /> find . -maxdepth 1 -name "*"
  101.     .
  102.     ./users2
  103.     ./subdir
  104.     ./users
  105.     ./test.tar.bz2
  106.     #搜索深度为子一级子目录,这里可以看出子目录下刚刚创建的testfile已经被找到
  107.     /> find . -maxdepth 2 -name "*"  
  108.     .
  109.     ./users2
  110.     ./subdir
  111.     ./subdir/testfile
  112.     ./users
  113.     ./test.tar.bz2
  114.    
  115.     6. 排除指定子目录查找:
  116.     -path pathname -prune:   避开指定子目录pathname查找。
  117.     -path expression -prune:  避开表达中指定的一组pathname查找。
  118.     需要说明的是,如果同时使用-depth选项,那么-prune将被find命令忽略。
  119.     #为后面的示例创建需要避开的和不需要避开的子目录,并在这些子目录内均创建符合查找规则的文件。
  120.     /> mkdir DontSearchPath  
  121.     /> cd DontSearchPath
  122.     /> touch datafile1
  123.     /> cd ..
  124.     /> mkdir DoSearchPath
  125.     /> cd DoSearchPath
  126.     /> touch datafile2
  127.     /> cd ..
  128.     /> touch datafile3
  129.     #当前目录下,避开DontSearchPath子目录,搜索所有文件名为datafile*的文件。
  130.     /> find . -path "./DontSearchPath" -prune -o -name "datafile*" -print
  131.     ./DoSearchPath/datafile2
  132.     ./datafile3
  133.     #当前目录下,同时避开DontSearchPath和DoSearchPath两个子目录,搜索所有文件名为datafile*的文件。
  134.     /> find . \( -path "./DontSearchPath" -o -path "./DoSearchPath" \) -prune -o -name "datafile*" -print
  135.     ./datafile3
  136.         
  137.     7. 按文件权限属性查找:
  138.     -perm mode:   文件权限正好符合mode(mode为文件权限的八进制表示)。
  139.     -perm +mode: 文件权限部分符合mode。如命令参数为644(-rw-r--r--),那么只要文件权限属性中有任何权限和644重叠,这样的文件均可以被选出。
  140.     -perm -mode:  文件权限完全符合mode。如命令参数为644(-rw-r--r--),当644中指定的权限已经被当前文件完全拥有,同时该文件还拥有额外的权限属性,这样的文件可被选出。
  141.     /> ls -l
  142.     -rw-r--r--. 1 root            root           0 Nov 12 10:02 datafile3
  143.     -rw-r--r--. 1 root            root    10530 Nov 11 23:08 test.tar.bz2
  144.     -rw-r--r--. 1 stephen stephen        183 Nov 11 08:02 users
  145.     -rw-r--r--. 1 root            root        279 Nov 11 08:45 users2
  146.     /> find . -perm 644      #查找所有文件权限正好为644(-rw-r--r--)的文件。
  147.     ./users2
  148.     ./datafile3
  149.     ./users
  150.     ./test.tar.bz2
  151.     /> find . -perm 444      #当前目录下没有文件的权限属于等于444(均为644)。   
  152.     /> find . -perm -444     #644所包含的权限完全覆盖444所表示的权限。
  153.     .
  154.     ./users2
  155.     ./datafile3
  156.     ./users
  157.     ./test.tar.bz2
  158.     /> find . -perm +111    #查找所有可执行的文件,该命令没有找到任何文件。
  159.     /> chmod u+x users     #改变users文件的权限,添加owner的可执行权限,以便于下面的命令可以将其找出。
  160.     /> find . -perm +111     
  161.     .
  162.     ./users   
  163.    
  164.     8. 按文件类型查找:
  165.     -type:后面指定文件的类型。
  166.     b - 块设备文件。
  167.     d - 目录。
  168.     c - 字符设备文件。
  169.     p - 管道文件。
  170.     l  - 符号链接文件。
  171.     f  - 普通文件。
  172.     /> mkdir subdir
  173.     /> find . -type d      #在当前目录下,找出文件类型为目录的文件。
  174.     ./subdir
  175.   /> find . ! -type d    #在当前目录下,找出文件类型不为目录的文件。
  176.     ./users2
  177.     ./datafile3
  178.     ./users
  179.     ./test.tar.bz2
  180.     /> find . -type f       #在当前目录下,找出文件类型为文件的文件
  181.     ./users2
  182.     ./datafile3
  183.     ./users
  184.     ./test.tar.bz2
  185.    
  186.     9. 按文件大小查找:
  187.     -size [+/-]100[c/k/M/G]: 表示文件的长度为等于[大于/小于]100块[字节/k/M/G]的文件。
  188.     -empty: 查找空文件。
  189.     /> find . -size +4k -exec ls -l {} \;  #查找文件大小大于4k的文件,同时打印出找到文件的明细
  190.     -rw-r--r--. 1 root root 10530 Nov 11 23:08 ./test.tar.bz2
  191.     /> find . -size -4k -exec ls -l {} \;  #查找文件大小小于4k的文件。
  192.     -rw-r--r--. 1 root            root 279 Nov 11 08:45 ./users2
  193.     -rw-r--r--. 1 root             root    0 Nov 12 10:02 ./datafile3
  194.     -rwxr--r--. 1 stephen stephen 183 Nov 11 08:02 ./users
  195.     /> find . -size 183c -exec ls -l {} \; #查找文件大小等于183字节的文件。
  196.     -rwxr--r--. 1 stephen stephen 183 Nov 11 08:02 ./users
  197.     /> find . -empty  -type f -exec ls -l {} \;
  198.     -rw-r--r--. 1 root root 0 Nov 12 10:02 ./datafile3
  199.    
  200.     10. 按更改时间比指定文件新或比文件旧的方式查找:
  201.     -newer file1 ! file2: 查找文件的更改日期比file1新,但是比file2老的文件。
  202.     /> ls -lrt   #以时间顺序(从早到晚)列出当前目录下所有文件的明细列表,以供后面的例子参考。
  203.     -rwxr--r--. 1 stephen stephen   183 Nov 11 08:02 users1
  204.     -rw-r--r--. 1 root           root    279 Nov 11 08:45 users2
  205.     -rw-r--r--. 1 root           root 10530 Nov 11 23:08 test.tar.bz2
  206.     -rw-r--r--. 1 root           root        0 Nov 12 10:02 datafile3
  207.     /> find . -newer users1     #查找文件更改日期比users1新的文件,从上面结果可以看出,其余文件均符合要求。
  208.     ./users2
  209.     ./datafile3
  210.     ./test.tar.bz2
  211.     /> find . ! -newer users2   #查找文件更改日期不比users1新的文件。
  212.     ./users2
  213.     ./users
  214.     #查找文件更改日期比users2新,但是不比test.tar.bz2新的文件。
  215.     /> find . -newer users2 ! -newer test.tar.bz2
  216.     ./test.tar.bz2
  217.    
  218.     细心的读者可能发现,关于find的说明,在我之前的Blog中已经给出,这里之所以拿出一个小节再次讲述该命令主要是因为以下三点原因:
  219.     1. find命令在Linux Shell中扮演着极为重要的角色;
  220.     2. 为了保证本系列的完整性;
  221.     3. 之前的Blog是我多年之前留下的总结笔记,多少有些粗糙,这里给出了更为详细的举例。
  222. 十七. xargs命令:
  223.     该命令的主要功能是从输入中构建和执行shell命令。      
  224.     在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。  
  225.     find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。  
  226.     在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;  
  227.     而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
  228.     /> ls -l
  229.     -rw-r--r--. 1 root root        0 Nov 12 10:02 datafile3
  230.     -rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2
  231.     -rwxr--r--. 1 root root    183 Nov 11 08:02 users
  232.     -rw-r--r--. 1 root root    279 Nov 11 08:45 users2
  233.     #查找当前目录下的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件。
  234.     /> find . -type f -print | xargs file
  235.     ./users2:        ASCII text
  236.     ./datafile3:      empty
  237.     ./users:          ASCII text
  238.     ./test.tar.bz2: bzip2 compressed data, block size = 900k
  239.     #回收当前目录下所有普通文件的执行权限。
  240.     /> find . -type f -print | xargs chmod a-x
  241.     /> ls -l
  242.     -rw-r--r--. 1 root root     0 Nov 12 10:02 datafile3
  243.     -rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2
  244.     -rw-r--r--. 1 root root   183 Nov 11 08:02 users
  245.     -rw-r--r--. 1 root root   279 Nov 11 08:45 users2
  246.     #在当面目录下查找所有普通文件,并用grep命令在搜索到的文件中查找hostname这个词
  247.     /> find . -type f -print | xargs grep "hostname"
  248.     #在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中。
  249.     /> find / -name "core" -print | xargs echo "" >/tmp/core.log  
  250.     /> pgrep mysql | xargs kill -9  #直接杀掉mysql的进程
  251.     [1]+  Killed                  mysql
复制代码
来自:http://www.cnblogs.com/stephen-l ... /12/01/2255665.html
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-7 14:17 , Processed in 0.020496 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表