下面给出find命令的主要应用示例:
[root@xieqichao ~]# 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会从指定的目录搜索,并递归的搜索其子目录。
[root@xieqichao ~]# find . -name "*.log"
./install.log
[root@xieqichao ~]# find . -iname U* #如果执行find . -name U*将不会找到匹配的文件
users users2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
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分钟之内[之外]的文件。
[root@xieqichao ~]# find -ctime -2 #找出距此时2天之内创建的文件
.
./users2
./install.log
./testfile.dat
./users
./test.tar.bz2
[root@xieqichao ~]# find -ctime +2 #找出距此时2天之前创建的文件
没有找到 #因为当前目录下所有文件都是2天之内创建的
[root@xieqichao ~]# touch install.log #手工更新install.log的最后访问时间,以便下面的find命令可以找出该文件
[root@xieqichao ~]# find . -cmin -3 #找出修改状态时间在3分钟之内的文件。
install.log
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
3. 基于找到的文件执行指定的操作:
-exec: 对匹配的文件执行该参数所给出的shell命令。
相应命令的形式为'command' {} \;,注意{}和\;
之间的空格,同时两个{}之间没有空格
-ok: 其主要功能和语法格式与-exec完全相同
,唯一的差别是在于该选项更加安全,因为它会在每次执行shell命令之前均予以提示,
只有在回答为y的时候,其后的shell命令才会被继续执行。需要说明的是,
该选项不适用于自动化脚本,因为该提供可能会挂起整个自动化流程。
#找出距此时2天之内创建的文件,同时基于find的结果,应用-exec之后的命令,
即ls -l,从而可以直接显示出find找到文件的明显列表。
[root@xieqichao ~]# 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天之内的文件。
如果找到就删除他们。有的时候,这样的写法由于是在找到之后立刻删除,因此存在一定误删除的危险。
[root@xieqichao ~]# ls
install.log testfile.dat test.tar.bz2 users users2
[root@xieqichao ~]# find . -name "*.log" -mtime -1 -exec rm -f {} \;
[root@xieqichao ~]# ls
testfile.dat test.tar.bz2 users users2
在控制台下,为了使上面的命令更加安全,我们可以使用-ok替换-exec,见如下示例:
[root@xieqichao ~]# find . -name "*.dat" -mtime -1 -ok rm -f {} \;
< rm ... ./testfile.dat > ? y #对于该提示,如果回答y,找到的*.dat文件将被删除,
这一点从下面的ls命令的结果可以看出。
[root@xieqichao ~]# ls
test.tar.bz2 users users2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
4. 按文件所属的owner和group查找:
-user: 查找owner属于-user选项后面指定用户的文件。
! -user: 查找owner不属于-user选项后面指定用户的文件。
-group: 查找group属于-group选项后面指定组的文件。
! -group: 查找group不属于-group选项后面指定组的文件。
[root@xieqichao ~]# 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
[root@xieqichao ~]# chown stephen users #将users文件的owner从root改为stephen。
[root@xieqichao ~]# 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
[root@xieqichao ~]# find . -user root #搜索owner是root的文件
.
./users2
./test.tar.bz2
[root@xieqichao ~]# find . ! -user root #搜索owner不是root的文件,注意!和-user之间要有空格。
./users
[root@xieqichao ~]# 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
[root@xieqichao ~]# chgrp stephen users #将users文件的所属组从root改为stephen
[root@xieqichao ~]# 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
[root@xieqichao ~]# find . -group root #搜索所属组是root的文件
.
./users2
./test.tar.bz2
[root@xieqichao ~]# find . ! -group root #搜索所属组不是root的文件,注意!和-user之间要有空格。
./users
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
5. 按指定目录深度查找:
-maxdepth: 后面的参数表示距当前目录指定的深度,
其中1表示当前目录,2表示一级子目录,以此类推。在指定该选项后,
find只是在找到指定深度后就不在递归其子目录了。
下例中的深度为1,表示只是在当前子目录中搜索。如果没有设置该选项,find将递归当前目录下的所有子目录。
[root@xieqichao ~]# mkdir subdir #创建一个子目录,并在该子目录内创建一个文件
[root@xieqichao ~]# cd subdir
[root@xieqichao ~]# touch testfile
[root@xieqichao ~]# cd ..
#maxdepth后面的参数表示距当前目录指定的深度,
其中1表示当前目录,2表示一级子目录,以此类推。在指定该选项后,
find只是在找到指定深度后就不在递归其子目录了。下例中的深度为1,
表示只是在当前子目录中搜索。如果没有设置该选项,find将递归当前目录下的所有子目录。
[root@xieqichao ~]# find . -maxdepth 1 -name "*"
.
./users2
./subdir
./users
./test.tar.bz2
#搜索深度为子一级子目录,这里可以看出子目录下刚刚创建的testfile已经被找到
[root@xieqichao ~]# find . -maxdepth 2 -name "*"
.
./users2
./subdir
./subdir/testfile
./users
./test.tar.bz2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
6. 排除指定子目录查找:
-path pathname -prune: 避开指定子目录pathname查找。
-path expression -prune: 避开表达中指定的一组pathname查找。
需要说明的是,如果同时使用-depth选项,那么-prune将被find命令忽略。
#为后面的示例创建需要避开的和不需要避开的子目录,并在这些子目录内均创建符合查找规则的文件。
[root@xieqichao ~]# mkdir DontSearchPath
[root@xieqichao ~]# cd DontSearchPath
[root@xieqichao ~]# touch datafile1
[root@xieqichao ~]# cd ..
[root@xieqichao ~]# mkdir DoSearchPath
[root@xieqichao ~]# cd DoSearchPath
[root@xieqichao ~]# touch datafile2
[root@xieqichao ~]# cd ..
[root@xieqichao ~]# touch datafile3
#当前目录下,避开DontSearchPath子目录,搜索所有文件名为datafile*的文件。
[root@xieqichao ~]# find . -path "./DontSearchPath" -prune -o -name "datafile*" -print
./DoSearchPath/datafile2
./datafile3
#当前目录下,同时避开DontSearchPath和DoSearchPath两个子目录,搜索所有文件名为datafile*的文件。
[root@xieqichao ~]# find . \( -path "./DontSearchPath" -o -path "./DoSearchPath" \) \
-prune -o -name "datafile*" -print
./datafile3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
7. 按文件权限属性查找:
-perm mode: 文件权限正好符合mode(mode为文件权限的八进制表示)。
-perm +mode: 文件权限部分符合mode。如命令参数为644(-rw-r--r--),
那么只要文件权限属性中有任何权限和644重叠,这样的文件均可以被选出。
-perm -mode: 文件权限完全符合mode。如命令参数为644(-rw-r--r--),
当644中指定的权限已经被当前文件完全拥有,同时该文件还拥有额外的权限属性,这样的文件可被选出。
[root@xieqichao ~]# 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
[root@xieqichao ~]# find . -perm 644 #查找所有文件权限正好为644(-rw-r--r--)的文件。
./users2
./datafile3
./users
./test.tar.bz2
[root@xieqichao ~]# find . -perm 444 #当前目录下没有文件的权限属于等于444(均为644)。
[root@xieqichao ~]# find . -perm -444 #644所包含的权限完全覆盖444所表示的权限。
.
./users2
./datafile3
./users
./test.tar.bz2
[root@xieqichao ~]# find . -perm +111 #查找所有可执行的文件,该命令没有找到任何文件。
[root@xieqichao ~]# chmod u+x users #改变users文件的权限,添加owner的可执行权限,
以便于下面的命令可以将其找出。
[root@xieqichao ~]# find . -perm +111
.
./users
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
8. 按文件类型查找:
-type:后面指定文件的类型。
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
[root@xieqichao ~]# mkdir subdir
[root@xieqichao ~]# find . -type d #在当前目录下,找出文件类型为目录的文件。
./subdir
[root@xieqichao ~]# find . ! -type d #在当前目录下,找出文件类型不为目录的文件。
./users2
./datafile3
./users
./test.tar.bz2
[root@xieqichao ~]# find . -type f #在当前目录下,找出文件类型为文件的文件
./users2
./datafile3
./users
./test.tar.bz2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
9. 按文件大小查找:
-size [+/-]100[c/k/M/G]: 表示文件的长度为等于[大于/小于]100块[字节/k/M/G]的文件。
-empty: 查找空文件。
[root@xieqichao ~]# find . -size +4k -exec ls -l {} \; #查找文件大小大于4k的文件,
同时打印出找到文件的明细
-rw-r--r--. 1 root root 10530 Nov 11 23:08 ./test.tar.bz2
[root@xieqichao ~]# 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
[root@xieqichao ~]# find . -size 183c -exec ls -l {} \; #查找文件大小等于183字节的文件。
-rwxr--r--. 1 stephen stephen 183 Nov 11 08:02 ./users
[root@xieqichao ~]# find . -empty -type f -exec ls -l {} \;
-rw-r--r--. 1 root root 0 Nov 12 10:02 ./datafile3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
10. 按更改时间比指定文件新或比文件旧的方式查找:
-newer file1 ! file2: 查找文件的更改日期比file1新,但是比file2老的文件。
[root@xieqichao ~]# 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
[root@xieqichao ~]# find . -newer users1 #查找文件更改日期比users1新的文件,从上面结果可以看出,其余文件均符合要求。
./users2
./datafile3
./test.tar.bz2
[root@xieqichao ~]# find . ! -newer users2 #查找文件更改日期不比users1新的文件。
./users2
./users
#查找文件更改日期比users2新,但是不比test.tar.bz2新的文件。
[root@xieqichao ~]# find . -newer users2 ! -newer test.tar.bz2
./test.tar.bz2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet">
<div class="more-toolbox">
<div class="left-toolbox">
<ul class="toolbox-list">
<li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
<use xlink:href="#csdnc-thumbsup"></use>
</svg><span class="name">点赞</span>
<span class="count"></span>
</a></li>
<li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{"mod":"popu_824"}"><svg class="icon" aria-hidden="true">
<use xlink:href="#icon-csdnc-Collection-G"></use>
</svg><span class="name">收藏</span></a></li>
<li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{"mod":"1582594662_002"}"><svg class="icon" aria-hidden="true">
<use xlink:href="#icon-csdnc-fenxiang"></use>
</svg>分享</a></li>
<!--打赏开始-->
<!--打赏结束-->
<li class="tool-item tool-more">
<a>
<svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
</a>
<ul class="more-box">
<li class="item"><a class="article-report">文章举报</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="person-messagebox">
<div class="left-message"><a href="https://blog.csdn.net/xie_qi_chao">
<img src="https://profile.csdnimg.cn/B/F/6/3_xie_qi_chao" class="avatar_pic" username="xie_qi_chao">
<img src="https://g.csdnimg.cn/static/user-reg-year/1x/2.png" class="user-years">
</a></div>
<div class="middle-message">
<div class="title"><span class="tit"><a href="https://blog.csdn.net/xie_qi_chao" data-report-click="{"mod":"popu_379"}" target="_blank">解启超</a></span>
</div>
<div class="text"><span>发布了357 篇原创文章</span> · <span>获赞 54</span> · <span>访问量 3万+</span></div>
</div>
<div class="right-message">
<a href="https://im.csdn.net/im/main.html?userName=xie_qi_chao" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
</a>
<a class="btn btn-sm attented bt-button personal-watch" data-report-click="{"mod":"popu_379"}">已关注</a>
</div>
</div>
</div>
</article>