Linux下的Find命令学习
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
有以下四大表达式:
- operators(逻辑运算):就是
and
,or
,not
这些东西 - options(可选项?):感觉是一些额外可选的功能
- tests(条件属性):各种属性啦,文件名,文件大小之类的
- 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
的时候条件属性是我们的核心,这里有两个技巧
如果属性后面跟着的条件是数字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字节的文件
如果属性后面跟着的条件是字串,那么一般都支持通配符
*
、?
、[ ]
[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]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权