Linux下find命令在目录结构中搜索文件,并执行指定的操作。
Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限。 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个非常大的文件系统可能会花费很多的时间(这里是指30G字节以上的文件系统)。
1.命令格式:
find PATH [options][action]
2.命令功能:
用于在文件树种查找文件,并作出相应的处理(可能访问磁盘)
3.选项与参数:
1.与时间有关的选项:共有 -atime , -ctime , -mtime ,以 -mtime为例
-mtime n : n为数字,意义为在 n 天之前的 [ 一天之内 ] 被更动过内容的档案;
-mtime +n : 列出在 n 天之前(不含n天本身)被更动过内容的档案档名;
-mtime -n : 列出在 n 天之内(含n天本身)被更动过内容的档案档名;
-newer file : file 为一个存在的档案,列出比 file 还要新的档案档名;
举例1:
#find / -mtime 0
0 表示目前时间,所以,从现在开始到24小时前,有变动过内容的档案都会被列出来!如果是三天之前的24小时内,则被表示为 # find / -mtime 3
举例2:
#find /etc -newer /etc/passwd
-newer 用在分辨两个档案之间的新旧关系是很有用的!
我们现在知道 atime ,ctime ,mtime 的意义,如果你想找出一天内被更改过的文件名,可以用举例1 的做法,但如果我想要找出『 4 天内被更改过的档案档名』呢?那可以使用『find /var -mtime -4 』。那如果是『 4 天前的那一天』就用『find /var -mtime 4 』。有没有加上『 +, -』差别很大!我们可以用简单的图示来说明一下
find相关的时间参数的意义
图中最右边为目前的时间,越往左边则代表越早前的时间轴啦。由图我们可以清楚的知道:
+4 代表大于等于 5 天前的档名:ex> find /var -mtime +4
-4 代表小于等于4 天内的档名:ex> find /var -mtime -4
4 则是代表 4-5 那一天档名:ex> find /var -mtime 4
2.与使用者或组名有关的参数:
-uid n : n 为数字,这个数字是用户的账号ID,即UID,
这个UID是记录在 /etc/passwd 里面与账号名称对应的数字。
-gid n : n 为数字,这个数字是组名的ID,即GID,
这个GID是记录在 /etc/group 里面
-uesr name : name 为使用者账号名称
-group name : name 为组名
-nouser : 寻找档案的拥有者不存在 /etc/passwd 的人
-nogroup : 寻找档案的拥有群组不存在与 /etc/group 的档案
当你自行安装软件时,很可能改软件的属性中并咩有档案拥有者,这是可能的!在这个时候,就可以使用 -nouser 和 -nogroup 搜寻。
举例3:
#find /home -user zyn
搜寻 /home 下属于zyn 的档案
举例4:
#find / -nouser
找到系统不属于任何人的档案
如果你将系统里的某个账号删除了,但该账号已经在系统里面建立很多档案时,就可能发生无主孤魂的档案讯在,此时你就可以用 -nouser 来找出该类型的档案并删除了。
3.与档案权限及名称有关的参数:
- name filename : 搜寻文件名为 filename 的档案;
-size [ +- ] SIZE : 搜寻比 SIZE 还要大或小的档案,这个 SIZE 的规格有:c 代表byte ,k 代表 1024bytes, 所以,要找比50KB 还要打的档案,就是 [ -size + 50K ];
-type TYPE : 搜寻档案的类型为 TYPE 的,类型主要有:一般正规档案(f), 装置档案 (b,c),目录(d),连接档案(l),scoket(s),及 FIFO (p)等属性。
-perm mode : 搜寻档案权限 【刚好等于】 mode 的档案,这个mode 为类似 chmod 的属 性值,举例: -rwsr-xr-x ,即4755,
-perm -mode : 搜寻档案权限【必须要全部囊括 mode的权限】的档案,举例:要搜寻
-rwxr--r-- ,即0744的档案,使用 -perm -0744,当一个档案的权限为
-rwsr-xr-x ,即4755时,也会被列出来,因为 -rwsr-xr-x 的属性已经囊括了 -rwsr-xr-x 的属性了。
-perm +mode : 搜寻档案权限【包括任意mode的权限】的档案, 举例:搜寻 -rwxr-xr-x , 即 -perm +755 时,但一个文件属性为 -rw------- 也会被列出来,因为他 有-rw-------的属性存在!
举例5:
#find /-name passwd
找出档名为passwd 的这个档案
举例6:
#find /var -type s
找出 /var 目录下,文件类型为scoket的档名有哪些?
举例7:
#find /-perm +7000
搜寻档案中含有SUID 或 SGID 或 SBIT 属性的
所谓7000 就是 ---s--s--t ,那么只要有s或者t的就列出来, -7000 就是要含有---s--s--t 三个权限
4.额外可进行的动作:
-exec command : command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的 结果。
-print : 将结果打印到屏幕上,这个动作是预设动作!
举例8:
#find /-perm +7000 -exec ls -l{} \;
将上个例子找到的档案使用 ls -l 列出来
ls -l 就是额外的指令,指令不支持命令别名,所以不能用 ll
举例9:
#find / -size +1000k
找出大于1MB的档案
find的特殊功能就是能够进行额外的动作(action),我们将例8用途来说明一下;
{}代表的是有find找到的内容,如上图所示,find结果会被放到{} 位置中
-exec一直到 \; 是关键词,代表find额外动作的开始(-exec)到结束(\;),在这中间的就是find 指令内的额外动作,在本例中就是【 ls -l{} 】.
因为【 ;】在bash下是有特殊意义的,因此利用反斜杠来跳脱。