一、前言
find命令用于在指定目录下查找文件,并且搜索完成后可以执行相应的操作,搜索时我们可以根据参数指定相应的搜索条件,比如按文件名,文件类型,时间戳等。find命令的功能特别强大,今天就来简单学习下它的使用。
二、命令介绍
首先,我们find --help
一下,可以看到find命令的格式为:
find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
好像看上去比较复杂,没事一般的时候我们也用不到,我们来简化一下这个格式:
find path -options[-print][-exec][-ok][...]
这里介绍下相应的参数:
- path,表示find命令所查找的目录,比如用.来表示当前目录,用/来表示系统根目录;
- -print,表示将查找到的文件输出到标准输出,如果没有指定,默认是该模式;
- -exec,对查找到的文件执行该参数所给出的shell命令,相应命令的形式为'command' {} ;,注意 {} 和 \ ; 之间的空格;
- -ok,和-exec选项功能类似,但该选项更安全,在执行每一个命令之前,都会给出提示,让用户来确定是否执行;
另外,相应的查询参数:
-name 按照文件名查找文件;
-iname 按照文件名查找,但会忽略大小写;
-perm 按照文件权限来查找文件;
-prune 查找时忽略某目录;
-path pattern:根据完整路径查找文件名为pattern的文件;
-ipath:忽略大小写;
-empty:查找文件为空而且是一个普通文件或者目录;
-type 查找某一类型的文件,比如:
b -块设备文件;
c -字符设备文件;
d -目录;
p -管道文件;
f -普通文件;
l -符号链接文件;
s -socket文件;
-amin n 查找系统中最后N分钟访问的文件
-atime n 查找系统中最后n天访问的文件
-cmin n 查找系统中最后N分钟被改变文件状态的文件
-ctime n 查找系统中最后n天被改变文件状态的文件
-mmin n 查找系统中最后N分钟被改变文件数据的文件
-mtime n 查找系统中最后n天被改变文件数据的文件
其中 -size
表示按照文件大小来查找,这里来详细说下:格式为 -size +1000n
,其中n表示单位:
- c 以字节单位;
- b 以块为单位,其中块大小为512字节,这个是默认单位;
- w 以words为单位,words表示两个字节;
- k 以1024字节为单位,也就是kilo bytes,kb;
- M-类似,以1024*1024字节为单位,也就是Mb;
- G-Gb;
另外,这里的前缀+-
,和时间是同一个意思,加号表示查找大于给定长度的文件,减号则是表示查找小于给定长度的文件;
三、实例
接下来,我们通过一些实例来看一下find命令的使用。首先,先看下最基础的查找模式,也就是默认是-print
的模式。
1. print 标准模式
1.1 查找48小时内修改过的文件
master@127.0.0.1:~$ find -atime -2
./.bash_profile
./.viminfo
./.viminfz.tmp
./.bash_history
./.bash_logout
1.2. 查找当前目录下以某个格式结尾的文件
master@127.0.0.1:/logs$ find . -name "*.log"
./redis.log
./test1.log
./test2.log
./test3.log
./test4.log
由于展示结果是类似的,所以这里只列相应的命令。
1.3)查找/logs目录下权限为 644的文件:
master@127.0.0.1:/logs$ find /log -perm 644
另外,我们在使用八进制查询的时候,可以在八进制数字前面加一个横杠 -,表示都匹配,如-007就相当于777,-005相当于555;
1.4)查找当目录以.log结尾的普通文件:
master@127.0.0.1:/logs$ find . -type f -name "*.log"
1.5)查找当前所有目录并排序:
master@127.0.0.1:/logs$ find . -type d | sort
1.6)查找当前目录大于1k的文件:
master@127.0.0.1:/logs$ find . -size +1000c -print
.
./temp
./temp/test-master
./lib
./lib/netty-codec-4.1.14.Final.jar
./lib/spring-rabbit-2.0.1.RELEASE.jar
这里,大于与小与的查询是可以同时使用的,如 查询 文件大小大于2M小于10M的:
master@127.0.0.1:/logs$ find . -size +2M -size -10M -print
1.7)在/目录下查找/start开头并且以end结尾的文件
master@127.0.0.1:/logs$ find / -path "/start*end"
1.8)如果在查找文件时希望忽略某个目录,我们可以使用-prune
选项,但使用的时候需要注意下,因为如果同时使用了-depth选项,那么-prune选项就会被find命令忽略,如果希望在test目录下查找文件,但不希望在test/test3目录下查找,可以使用:
master@127.0.0.1:/logs$ find test -path "test/test3" -prune -o -print
1.9)另外,我们可以借助-printf
来打印查找到的文件的相应属性,比如时间,大小等;
master@127.0.0.1:/logs$ find -type f -printf '%T+%p \n'
2019-06-10+16:18:39.8681443600./logs/test2.log
有关更多printf,可以参考:http://man.he.net/man1/find,然后搜索 **printf **,即可看到所有的选项。
2. exec 与ok 模式
如果只是查找的话,上面的这些查询已经够我们平时用了,不过我们有时候不仅仅是只查找一下,可能还会有后缀的操作,这个时候就要使用-exec
模式了。
-exec
后面跟的是shell命令,表示查询出对应的文件后进行其他命令操作。该模式结束是以 ; 为标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面会加反斜杠。
该命令格式一般为:
find path -exec command' {} \;
首先是exec选项,后面是要执行的命令或脚本,然后是一对{ },一个空格和一个\,最后是一个分号。其中花括号代表前面find查找出来的文件名;
2.1 查看并列出对应文件:
master@127.0.0.1:/logs$ find . -type f -exec ls -l {} \;
要注意末尾的花括号与斜杠之间的空格;
2.2 查找并删除修改时间在2天以前的文件:
master@127.0.0.1:/logs$ find . -type f -mtime +2 -exec rm {} \;
在任何删除之前,都应该先查看相应的文件,以免进行误删除操作;而 -ok
选项则可以看作是exec的安全模式,它会在删除前提示你进行确认:
master@127.0.0.1:/logs$ find . -name "*.log" -ok rm {} \;
< rm ... ./test2.log > ? y
它会在删除前进行确认,按y键进行删除,按n键取消删除;
2.3 查找文件并查找文件中的内容:
任何形式的命令都可以在exec选项中使用,这里我们可以使用grep来配合find命令:
master@127.0.0.1:/logs$ find /test -name "passwd*" -exec grep "root" {} \;
这里首先查找所有文件名以“passwd”开头的文件,然后执行grep命令看看在这些文件中是否存在一个root用户。
2.4 查找并复制文件到指定目录:
另外如果查找后移动或者复制文件到某个目录下的话,新的目录在花括号后指定,如:
master@127.0.0.1:/logs$ find . -name "*.log" -exec cp {} test3 \;
四、总结
当然除了这几种模式外,还有其他的模式,比如-execdir
,-okdir
等,等用到的时候再回来更新吧。
本文参考自:
每天一个linux命令(22):find 命令的参数详解
https://www.cnblogs.com/peida/archive/2012/11/15/2770888.html
http://man.he.net/man1/find
Linux中find命令使用-linux.cn