一、find命令介绍:
find是一个强大的文件搜索工具,包括目录文件和文本文件,它可以按文件名、文件类型、用户甚至是时间戳查找文件。它还可以找到这些属性任意组合的文件,还可以对它找到的文件执行操作。
二、find命令总解:
(1)基本格式:
find pathname -options [-print -exec -ok ...]
即 find [查找路径] [查找条件] [动作]
(2)查找条件:
-name, -iname, -user, -group, -uid, -gid, -nouser, -nogroup, -size, -type, -atime,-mtime,-ctime,-amin,-mmin,-cmin, -perm
(3)执行的动作:
-exec, -ok, -ls,| xargs COMMAND
三、find命令分解:
(1)查找条件:
1.1 -name “文件名称”:按照文件名称查找,可支持使用文件通配符,如*,?,[],[^]。
例如:查找/tmp下面以.txt结尾的文件:
[root@station156 ~]# find /tmp/ -name "*.txt" /tmp/aa.txt /tmp/bb.txt
1.2 -iname “文件名称”:查找时不区分字符大小写。
例如:查找/tmp下面以aa.或AA.开头的文件:
[root@station156 ~]# find /tmp/ -iname "aa.*" /tmp/aa.txt /tmp/aa.jpg /tmp/AA.txt /tmp/aa.doc /tmp/aa.docx
1.3 -user UserName:查找属主为指定用户的文件。
例如:查找/tmp下面属主是jim用户的文件:
[root@station156 tmp]# find /tmp/ -user jim /tmp/fstab [root@station156 tmp]# ll fstab -rw-r--r-- 1 jim jim 921 Feb 26 15:28 fstab
1.4 -group GroupName:查找属组为某个基本组的用户。
例如:查找/tmp下面属主是fedora用户且属组是fedora基本组的文件:
[root@station156 ~]# find /tmp/ -user fedora -a -group fedora /tmp/meminfo /tmp/mounts [root@station156 ~]# ll /tmp/{meminfo,mounts} -r--r--r-- 1 fedora fedora 1170 Feb 26 15:30 /tmp/meminfo -r--r--r-- 1 fedora fedora 896 Feb 26 15:30 /tmp/mounts
说明:组合条件:-a代表并且的意思,即左右2个条件都必须符合;-o代表或者的意思,即左右2个条件有一个符合即可;-not代表非,取反。
1.5 -uid UID:查找uid为指定uid号的用户的文件;-gid:查找gid为指定gid号的基本组的文件。
例如:
查找uid号为501的用户且gid也为501的用户的文件:
-r--r--r-- 1 501 501 1170 Feb 26 15:30 meminfo -r--r--r-- 1 501 501 896 Feb 26 15:30 mounts -rw-------. 1 root root 0 Feb 18 20:25 yum.log [root@station156 tmp]# find /tmp/ -uid 501 -a -gid 501 /tmp/meminfo /tmp/mounts
1.6 -nouser:查找没有属主的文件;-nogroup: 查找没有属组的文件。
例如:查找/tmp/下面没有属主的用户:
-r--r--r-- 1 501 501 1170 Feb 26 15:30 meminfo -r--r--r-- 1 501 501 896 Feb 26 15:30 mounts -rw-------. 1 root root 0 Feb 18 20:25 yum.log [root@station156 tmp]# find /tmp/ -nouser /tmp/meminfo /tmp/mounts
1.7 -type: 根据文件类型查找,文件类型包括:
f: 普通文件
d: 目录
b: 块设备
c: 字符设备
l: 符号链接文件
p: 命名管道
s: 套接字
例1:查找/tmp/下面文件类型为普通文件且属主不是root的文件:
[root@station156 tmp]# find /tmp/ -type f -a -not -user root /tmp/meminfo /tmp/mounts /tmp/fstab [root@station156 tmp]# ll /tmp/{meminfo,mounts,fstab} -rw-r--r-- 1 jim jim 921 Feb 26 15:28 /tmp/fstab -r--r--r-- 1 501 501 1170 Feb 26 15:30 /tmp/meminfo -r--r--r-- 1 501 501 896 Feb 26 15:30 /tmp/mounts
例2:查找/etc/下文件类型是符号链接文件或者属组不是root的文件并统计出行数:
[root@station156 tmp]# find /etc/ -type l -o -not -group root | wc -l 545
1.8 -size: 根据文件大小查找,常用单位是k,M,G。如:5M表示4M至5M之间大小的文件,+5M表示5M以上大小的文件,-5M表示小于4M的文件。
例如:查找/var/log/下面小于1M的文件:
[root@station156 ~]# find /var/log/ -size -1M -ls 1179664 0 -rw------- 1 root root 0 Feb 18 21:07 /var/log/spooler 1179682 0 -rw-r--r-- 1 root root 0 Feb 18 21:53 /var/log/wpa_supplicant.log 1179681 0 -rw------- 1 root root 0 Feb 18 21:53 /var/log/spice-vdagent.log 1179651 0 -rw------- 1 root root 0 Feb 18 20:39 /var/log/tallylog
1.9 根据时间戳查找:
(1)以天为单位(time):
-atime: 访问时间
-mtime:修改时间
-ctime: 改变时间
说明:-atime 5:指第5天至第6天之间访问的时间,-atime +5:指第6天之前访问的时间,
-atime -5:指从现在至第5天访问的时间。
(2)以分钟为单位(min):
-amin :访问时间
-mmin :修改时间
-cmin :改变时间
例1:查看/tmp/下面修改时间超过1天且不超过2天的文件:
[root@station156 tmp]# find /tmp/ -mtime 1 /tmp/aa.txt [root@station156 tmp]# date Wed Feb 26 16:55:38 CST 2014 [root@station156 tmp]# stat aa.txt File: `aa.txt' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 1179656 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2014-02-26 15:14:08.008668747 +0800 Modify: 2014-02-25 10:10:00.000000000 +0800 Change: 2014-02-26 16:51:18.847654334 +0800
例2:查找/tmp/下面访问时间并且修改时间超过2天以上的文件:
[root@station156 tmp]# find /tmp/ -atime +1 -a -mtime +1 /tmp/ks-script-tY9s9a /tmp/ks-script-tY9s9a.log /tmp/yum.log [root@station156 tmp]# date Wed Feb 26 17:05:41 CST 2014 [root@station156 tmp]# stat /tmp/yum.log File: `/tmp/yum.log' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 1179650 Links: 1 Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2014-02-18 20:25:44.672999949 +0800 Modify: 2014-02-18 20:25:44.672999949 +0800 Change: 2014-02-18 20:25:44.672999949 +0800
例3:查找/tmp/下面访问时间在4分钟以内的文件:
[root@station156 tmp]# find /tmp/ -amin -4 /tmp/fstab /tmp/201402261710 /tmp/t [root@station156 tmp]# stat /tmp/fstab File: `/tmp/fstab' Size: 921 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 1179662 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 500/ jim) Gid: ( 500/ jim) Access: 2014-02-26 17:15:12.762648630 +0800 Modify: 2014-02-26 15:28:49.136660496 +0800 Change: 2014-02-26 17:15:12.762648630 +0800 [root@station156 tmp]# date Wed Feb 26 17:19:02 CST 2014
2.0 -perm:根据权限查找。
-perm +644:表示任何用户只要有其中的任何一项权限就行,+644表示属主有读或者写的权限,或者属组有读的权限,或者其它用户有读的权限。
“+”在这里是或者的意思。
-perm -644:表示每类用户的指定要检查的权限位都匹配,-644表示属主必须有读和写的权限,并且属组有读的权限,并且其它用户有读的权限。
“-”在这里是并且的意思。
例1:查找/etc/目录所有用户都没有写权限的文件:
[root@station156 ~]# find /etc/ -not -perm +222 -exec ls -l {} \; -r-xr-xr-x. 1 root root 2134 Feb 22 2013 /etc/rc.d/init.d/lvm2-lvmetad -r-xr-xr-x. 1 root root 1340 Feb 22 2013 /etc/rc.d/init.d/blk-availability -r-xr-xr-x. 1 root root 2665 Feb 22 2013 /etc/rc.d/init.d/lvm2-monitor -r--r--r--. 1 root root 324 Feb 22 2013 /etc/ld.so.conf.d/kernel-2.6.32-358.el6.x86_64.conf
说明:-not -perm +222 相当于 非(A或B或C)=非A且非B且非C
例2:查找/etc/目录下至少有一类用户没有写权限:
[root@station156 ~]# find /tmp/ -not -perm -222 -exec ls -l {} \; -r--r--r-- 1 501 501 1170 Feb 26 15:30 /tmp/meminfo -rwx------. 1 root root 1182 Feb 18 21:52 /tmp/ks-script-tY9s9a -rwxr-xr-x. 1 root root 346 Feb 18 21:52 /tmp/ks-script-tY9s9a.log -rw-------. 1 root root 0 Feb 18 20:25 /tmp/yum.log -rw-r--r-- 1 root root 0 Feb 25 10:10 /tmp/aa.txt -r--r--r-- 1 501 501 896 Feb 26 15:30 /tmp/mounts -rw-r--r-- 1 root root 0 Feb 26 15:14 /tmp/aa.jpg -rw-r--r-- 1 root root 0 Feb 26 15:21 /tmp/AA.txt
说明:-not -perm -222 相当于: 非(A且B且C)= 非A或非B或非C
(2)处理的动作:
1.1 -ls:以长格式输出各文件信息。
例如:查找/tmp/下最近1天内其内容修改过的且不属于root或jim用户的文件,并以长格式显示出来:
[root@station156 ~]# find /tmp/ -mtime -1 -a -not \( -user root -o -user jim \) -ls 1179667 20 -rw-r--r-- 1 hadoop hadoop 18216 Feb 26 18:03 /tmp/kkk 1179664 4 -r--r--r-- 1 hadoop hadoop 1170 Feb 26 15:30 /tmp/meminfo 1179663 4 -r--r--r-- 1 hadoop hadoop 896 Feb 26 15:30 /tmp/mounts [root@station156 ~]# stat /tmp/kkk File: `/tmp/kkk' Size: 18216 Blocks: 40 IO Block: 4096 regular file Device: fd00h/64768d Inode: 1179667 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 501/ hadoop) Gid: ( 501/ hadoop) Access: 2014-02-26 18:03:52.514642842 +0800 Modify: 2014-02-26 18:03:52.514642842 +0800 Change: 2014-02-26 18:03:52.514642842 +0800 [root@station156 ~]# date Wed Feb 26 18:06:40 CST 2014
1.2 -exec COMMAND {} \; :对查找到的文件执行指定的命令。“{}”代表前面find所查找到的文件。
例如:查找/tmp/下文件类型是普通文件且属主是jim的文件,并显示文件中的内容:
[root@station156 ~]# find /tmp/ -type f -a -user jim -exec cat {} \; # # /etc/fstab # Created by anaconda on Tue Feb 18 20:26:51 2014 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/vg0-root / ext4 defaults 1 1 UUID=041d4189-4001-463d-a3d1-4e07cc718989 /boot ext4 defaults 1 2 /dev/mapper/vg0-usr /usr ext4 defaults 1 2 /dev/mapper/vg0-var /var ext4 defaults 1 2 /dev/mapper/vg0-swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
1.3 -ok COMMAND {} \; : 交互式的-exec。
1.4 find | xargs COMMAND :把find所查找到的文件通过管道的方式给后面的xargs来执行命令操作。
例如:把/tmp/下面文件类型是文本文件且属主是jim的文件的属主、属组和其它用户的权限都改为只读:
[root@station156 tmp]# find /tmp/ -type f -a -user jim | xargs chmod 444 [root@station156 tmp]# ll /tmp/fstab -r--r--r-- 1 jim jim 921 Feb 26 15:28 /tmp/fstab
四、find命令后语:
find命令可以实时并精确地查找文件,方便linux运维工程师的日常工作,但它非常的消耗资源,会使得系统性能下降,所以我们尽量把它放在后台执行,或是小范围的查找。