文章目录
  1. 1. Find介绍
  2. 2. 逻辑运算
  3. 3. 可选项
  4. 4. 条件属性
  5. 5. 行为
  6. 6. 总结
  7. 7. 参考

find命令极为好使,在面试中也常常会被问到,所以在这里再好好学习一下^_^
注:本文使用的环境是CentOS6.5

Find介绍

功能:在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的查找条件,功能很强大。 
语法:find 起始目录 寻找条件 操作 
说明:find命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足寻找条件的文件并对之采取相关的操作。 

其实关于Linux下的命令一般通过—help就可以大致入门使用,实在不行再用man来看更为完整版的手册。
下面先长长得列一下:

[root@master spark-1.3.1-bin-hadoop2.6]# find --help
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

default path is the current directory; default expression is -print
expression may consist of: operators, options, tests, and actions:

operators (decreasing precedence; -and is implicit where no others are given):
      ( EXPR )   ! EXPR   -not EXPR   EXPR1 -a EXPR2   EXPR1 -and EXPR2
      EXPR1 -o EXPR2   EXPR1 -or EXPR2   EXPR1 , EXPR2

positional options (always true): -daystart -follow -regextype

normal options (always true, specified before other expressions):
      -depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
      --version -xdev -ignore_readdir_race -noignore_readdir_race

tests (N can be +N or -N or N): -amin N -anewer FILE -atime N -cmin N
      -cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
      -ilname PATTERN -iname PATTERN -inum N -iwholename PATTERN -iregex PATTERN
      -links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
      -nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN
      -readable -writable -executable
      -wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N
      -used N -user NAME -xtype [bcdpfls]
      -context CONTEXT


actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print
      -fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
      -exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
      -execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;

Report (and track progress on fixing) bugs via the findutils bug-reporting
page at http://savannah.gnu.org/ or, if you have no web access, by sending
email to <bug-findutils@gnu.org>.

—help中我们大致可以发现find有以下四大表达式:

  1. operators(逻辑运算):就是and,or,not这些东西
  2. options(可选项?):感觉是一些额外可选的功能
  3. tests(条件属性):各种属性啦,文件名,文件大小之类的
  4. acionts(行为):find之后想干嘛呢?打印出来 or 去执行

先来看一下当前的实验目录(使用了spark已编译的一个根目录):

[root@master spark-1.3.1-bin-hadoop2.6]# ll
total 408
drwxrwxr-x. 2 1000 1000   4096 Apr 11 01:32 bin
-rw-rw-r--. 1 1000 1000 278851 Apr 11 01:32 CHANGES.txt
drwxrwxr-x. 2 1000 1000   4096 May 17 09:00 conf
drwxrwxr-x. 3 1000 1000   4096 Apr 11 01:32 data
drwxrwxr-x. 3 1000 1000   4096 Apr 11 01:32 ec2
drwxrwxr-x. 3 1000 1000   4096 Apr 11 01:32 examples
drwxrwxr-x. 2 1000 1000   4096 Apr 11 01:32 lib
-rw-rw-r--. 1 1000 1000  46083 Apr 11 01:32 LICENSE
drwxr-xr-x. 2 root root   4096 Jul 22 11:28 logs
-rw-rw-r--. 1 1000 1000  22559 Apr 11 01:32 NOTICE
drwxrwxr-x. 7 1000 1000   4096 Apr 11 01:32 python
-rw-rw-r--. 1 1000 1000   3629 Apr 11 01:32 README.md
-rw-rw-r--. 1 1000 1000    157 Apr 11 01:32 RELEASE
drwxr-xr-x. 2 root root   4096 Jul 20 09:33 runjar
drwxrwxr-x. 2 1000 1000   4096 Apr 11 01:32 sbin
drwx------. 2 root root   4096 May 22 23:24 spark-99afc66e-6bb1-41ee-8497-e2abdbb3013f
drwx------. 2 root root   4096 May 22 23:24 spark-e0919038-82ee-4d5d-b421-1f50f6a110ed
drwx------. 2 root root   4096 May 22 23:24 spark-f37f1978-ad83-4208-86d8-2bdf8c3e5696

在该目录下最简单的使用一个find操作

[root@master spark-1.3.1-bin-hadoop2.6]# find -name "NOTICE"
./NOTICE

可以看到NOTEICE这个文件就查询出来了。

逻辑运算

find命令通过逻辑运算可以完成强大的组合查询,先抛开这个,看看我们码农平常写的条件判断:

1
if(f1 && (f2 || f3) && !f4)

find的逻辑运算与之对应的就是:

  • &&对应-and,简写为:-a

    [root@master spark-1.3.1-bin-hadoop2.6]# find -name "NOTICE" -a -size -20
    [root@master spark-1.3.1-bin-hadoop2.6]# find -name "NOTICE" -a -size +20
    ./NOTICE
    [root@master spark-1.3.1-bin-hadoop2.6]# find -name "NOTICE" -size +20
    ./NOTICE
    

    可以发现”NOTICE”文件并且小于20是找不到的,但是大于20b的时候可以找到

    注意,缺省操作符的情况就是使用-a,所以第三条命令和第二条命令的效果是一样的。

  • ||对应-or,简写为:-o

    [root@master spark-1.3.1-bin-hadoop2.6]# find -name "NOTICE" -o -name "LICENSE"
    ./LICENSE
    ./NOTICE
    

    在或操作下两个文件都能查询出来

  • !还是对应!

    [root@master spark-1.3.1-bin-hadoop2.6]# find -maxdepth 1 ! -name "NOTICE" -size +20
    ./LICENSE
    ./CHANGES.txt
    

    这样就可以查找在当前目录下名字不叫“NOTICE”以及大于20b的文件/文件夹了

注意,关于操作符还可以使用括号将各个操作表达式括起来,用起来还是非常灵活的^_^

可选项

这个还是蛮有用的,看—help命令其实就是,还有:

  • -depth:使用它之后貌似先会从里向外打印,比如先找到最深的文件夹,然后一层一层向外显示
  • -maxdepth:限制递归的最大深度,如果只在当前目录下找,那么设置-maxdepth 1即可
  • -mindepth:限制最小深度,比如-mindepth 2 只查找深度大于2的文件
  • -daystart:限制查找的文件是今天起24小时的文件
  • -follow:遵循通配符链接方式查找
  • 还有其他等等

条件属性

在使用find的时候条件属性是我们的核心,这里有两个技巧

  1. 如果属性后面跟着的条件是数字N,那么一般支持+,-操作,比如

    [root@master spark-1.3.1-bin-hadoop2.6]# find -maxdepth 1 -type f -size +22559c
    ./LICENSE
    ./CHANGES.txt
    [root@master spark-1.3.1-bin-hadoop2.6]# find -maxdepth 1 -type f -size 22559c
    ./NOTICE
    [root@master spark-1.3.1-bin-hadoop2.6]# find -maxdepth 1 -type f -size -22559c
    ./README.md
    ./RELEASE
    

    上面3条命令分别就是查大于22559字节的文件,等于22559字节以及小于22559字节的文件

  2. 如果属性后面跟着的条件是字串,那么一般都支持通配符*?[ ]

    [root@master spark-1.3.1-bin-hadoop2.6]# find -maxdepth 1 -type f -name "RE*"
    ./README.md
    ./RELEASE
    

    取”RE”开头的文件名

接下来看一些常用的筛选属性(要知道全部的话看—help里面的信息即可)

  • -name PATTERN:根据文件名进行匹配

    估计是最为常用的一个属性之一了,上面的演示都是用它来作为示例,所以这里不加其他说明了

  • -type [bcdpflsD]:筛选查找的类型:
    • b 块设备文件
    • c 字符设备文件
    • d 目录文件
    • p 命名管道(FIFO)
    • f 普通文件
    • l 符号链接文件(symbolic links)
    • s socket文件
[root@master spark-1.3.1-bin-hadoop2.6]# find -maxdepth 1 -type f
./LICENSE
./CHANGES.txt
./README.md
./NOTICE
./RELEASE
[root@master spark-1.3.1-bin-hadoop2.6]# find -maxdepth 1 -type d
.
./sbin
./spark-f37f1978-ad83-4208-86d8-2bdf8c3e5696
./ec2
./bin
./spark-99afc66e-6bb1-41ee-8497-e2abdbb3013f
./data
./lib
./conf
./python
./examples
./runjar
./spark-e0919038-82ee-4d5d-b421-1f50f6a110ed
./logs


上述命名分别是查找当前目录下的文件和文件夹
  • - size:根据文件大小来进行匹配,这里大小的单位默认是字节b,还可以显式的其他单位bcwkMG
  • -perm: 查找具有指定权限的文件和目录

    [root@master spark-1.3.1-bin-hadoop2.6]# find -maxdepth 1 -perm 700
    ./spark-f37f1978-ad83-4208-86d8-2bdf8c3e5696
    ./spark-99afc66e-6bb1-41ee-8497-e2abdbb3013f
    ./spark-e0919038-82ee-4d5d-b421-1f50f6a110ed
    

    查找自有创建者才能用全完控制权限的目录和文件

  • -empty:查找大小为0的目录或者空文件
  • -user NAME:查找所属用户名的文件
  • -amin n:查找n分钟以前被访问过的所有文件
  • -atime n:查找n天以前被访问过的所有文件
  • -cmin n:查找n分钟以前文件状态被修改过的所有文件
  • -ctime n:查找n天以前文件状态被修改过的所有文件
  • -mmin n:查找n分钟以前文件内容被修改过的所有文件
  • -mtime n:查找n天以前文件内容被修改过的所有文件
  • 等等等自己看—help

行为

这里的行为是指找到文件之后再做的行为操作

  • -print:将找到的文件/文件夹的名称给打印出来
  • -ls:将找到的文件/文件夹的的具体信息列出来
  • -delete:将找到的文件/文件夹的删除掉
  • -exec command {} \;:异常强大,在command 里面可以写linux的命令

    [root@master spark-1.3.1-bin-hadoop2.6]# find -maxdepth 1 -size +20 -exec ls -l {} \;
    -rw-rw-r—. 1 1000 1000 46083 Apr 11 01:32 ./LICENSE
    -rw-rw-r—. 1 1000 1000 278851 Apr 11 01:32 ./CHANGES.txt
    -rw-rw-r—. 1 1000 1000 22559 Apr 11 01:32 ./NOTICE

    比如来实现-ls的功能

  • -xargs:也是异常强大,它会批次/依次的取得参数,进行相应的命令操作

    find -maxdepth 1 -size +20 -print |xargs grep "License"
    

    类似这个可以查找含有”License”的文件、文件夹

总结

find命令是一个非常优秀的工具,它可以按照用户指定的准则来匹配文件。使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。
但是这些命令还是得常用,但能熟能生巧啊-_-

参考


本作品采用[知识共享署名-非商业性使用-相同方式共享 2.5]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权

文章目录
  1. 1. Find介绍
  2. 2. 逻辑运算
  3. 3. 可选项
  4. 4. 条件属性
  5. 5. 行为
  6. 6. 总结
  7. 7. 参考