首页 > 其他 > 详细

find详解

时间:2015-12-20 17:41:09      阅读:218      评论:0      收藏:0      [点我收藏+]

目录:

一、使用方式大概。

二、各个查找方式的详细举例说明

三、综合举例。

我们在使用windows系统的过程中,常常会忘记印象中的某个文件给丢到哪里去了,又或者想要看看大于500K的图片有哪些,然后就会拉出来搜索功能搜一下。那么现在即然决定以后就要以linux为伍了,或是日常使用,或是工作。当然也要学习一下linux上面的搜索功能啦。


find就是这么一个很有名的工具,它是一种实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找。

可以基于用户,组,权限,大小,时间,文件类型和名称等等为条件来进行搜索。

工作方面常常用来实现查找无主文件、其它用户有写权限、其它用户有写又有执行权限的文件或是一些拥有特殊权限的文件等等还是很常用到的。


 一、使用方式大概:

使用方法:

find [OPTIONS]  [查找起始路径]  [查找条件]  [处理动作]


常用到的查找条件:

1、根据文件名查找(支持通配符,是find的通配机制,与bash无关。):

-name  "pattern"直接查找文件名
-name ‘passwd*‘
-iname "pattern"查找文件名,不区分大小写
-name ‘passwd*‘

  
2、根据文件从属关系查找:

-user USERNAME查找指定属主的文件
-user root
-group GRPNAME查找指定属组的文件-group root
-uid UID查找指定uid的文件
-uid 0
-gid GID查找指定gid的文件
-gid 0
-nouser查找没有属主名的文件(并不是没有uid)
-nouser
-nogroup查找没有属组名的文件(并不是没有gid)
-nogroup

              
3、根据文件类型查找:

-type TYPE:

-type f
查找普通文件
-type d
查找目录文件
-type l
查找链接文件
-type b
查找块设备文件
-type c
查找字符设备文件
-type p
查找管道文件
-type s
查找套接字文件


4、根据文件大小查找(注意是单位大小):

-size #

常用单位:K,M,G

-size 5k查找5k单位大小的文件(4k<文件<=5k)
-size -5k查找小于5k单位大小内的文件(文件<=4k)
-size +5k查找大于5k的文件(文件>5k)


5、根据文件的访问、修改时间来查找:

以天为单位,天的单位大小(0-24小时)

-atime查找访问时间相关
-mtime查找修改时间相关(修改数据)
-ctime查找改变时间相关(元数据变化时间)

只有访问时间和修改时间会经过我们的访问或修改数据发生变化,而元数据是自动变化的。


每个时间都有三种表示方式,如以atime说明。

-atime 1
过去1天被访问过的文件,过去48小时至过去24小时
-atime -1
过去1天以内被访问过的文件,过去24小时以内,等于0天
-atime +1
过去1天的过去被访问过的文件,过去48小时以外

注意:时间只能是过去的时间。而这里要表示的时间也是以过去表示的,而不是以当前的时间算的。如:1天就是过去的1天,而1天以外就是过去1天的以外。当前时间用0表示。

技术分享


以分钟为单位(使用方式与上面差不多一样,只不过不能用0,只能用-1来表示。而天数可以用0天)

-amin访问时间,分钟-amin -10查找10分钟内访问过的
-mmin修改时间,分钟-mmin -30查找30分钟内修改过的
-cmin改变时间,分钟

以文件来对比:

-newer file查找比file新的文件



6、根据文件权限查找:

-perm [/|-]mode

mode为指定的权限,在Centos6或更低的版本中/左斜杠为+加号。

mode精确匹配权限-perm 777精确匹配(rwxrwxrwx)权限
/mode只要有其中一位权限区配即可-perm /664只要有其中之一(rw_rw_r__)
-mode只有包含此权限的-perm -664必须要有(rw_rw_r__)权限,可以多,不可以少

/mode各权限之间是一种或关系,只要有一个可以匹配(真),则结果为真。

-mode各权限之间是一种与关系,只有全部可以区配(全部为真),结果才能为真。至于多出来的权限,压根就不会区配,跟最终结果没有响影。

 

7、组合测试

-a与运算左右两个条件-name ‘passwd*’ –a  –type f-a可以省略,默认
-o或运算左右两个条件-type b –o –type c块设备或字符设备
-not, !逻辑非,不用解释了。! –perm /333所有用户都没有读写权限的文件

 

处理动作:

-print输出至标准输出;默认的动作;也就是显示到屏幕。
-ls类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息。
-fls /PATH/TO/SOMEFILE把查找到的所有文件的长格式信息保存至指定文件中。
-delete删除查找到的文件。
-ok COMMAND {} \;对查找到的每个文件执行由COMMAND表示的命令;
每次操作都由用户进行确认。
-exec COMMAND {} \;对查找到的每个文件执行由COMMAND表示的命令;
不用每次都确认。

注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令; 但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可规避此问题:find | xargs COMMAND

如: find /etc/ -type f | xargs ls -lh

 



二、详细举例说明:

1、基于名称来查找。

-name-iname

例:查找文件名为passwd的文件。

[root@localhost ~]# find /etc/ -iname‘passwd‘
/etc/passwd
/etc/pam.d/passwd

例:查找文件名中有passwd字符的文件。

[root@localhost ~]# find /etc/ -iname‘*passwd*‘
/etc/passwd
/etc/passwd-
/etc/security/opasswd
/etc/pam.d/passwd

2、基于用户或组查找。

-user-group

例:查找/tmp下用户为star的用户

[root@localhost tmp]# find /tmp -user star
/tmp/0
/tmp/1
/tmp/123
/tmp/123abc
......
[root@localhost tmp]# ll 0 1 123 123abc
-rw-rw-r-- 1 star star 0 Dec 17 01:24 0
-rw-r--r-- 1 star star 0 Dec 17 01:24 1
-rw-rw-r-- 1 star star 0 Dec 17 01:24 123
-rw-rw-r-- 1 star star 0 Dec 17 01:24123abc


例:查找无主或无组用户

-nogroup、-nogroup

[root@localhost tmp]# find / -nogroup -o -nouser
find: ‘/proc/2440/task/2440/fd/6’: No such file or directory
find: ‘/proc/2440/task/2440/fdinfo/6’: No such file or directory
find: ‘/proc/2440/fd/6’: No such file or directory
find: ‘/proc/2440/fdinfo/6’: No such file or directory
/var/db/sudo/sst
/var/html/dex.html
/tmp/test1
/tmp/test2

 

这样好像也看不出什么东西来,如果要查看文件属性,处理动作就用-ls。不过这里有个要注意的地方。我们先试一下看看。

[root@localhost tmp]# find / -nogroup -o -nouser -ls
find: ‘/proc/2441/task/2441/fd/6’: No such file or directory
find: ‘/proc/2441/task/2441/fdinfo/6’: No such file or directory
find: ‘/proc/2441/fd/6’: No such file or directory
find: ‘/proc/2441/fdinfo/6’: No such file or directory

 什么也没有显示出来。 这里的-nouser和-ls连到一起,被当做一个查找条件来使用了。

后面要加处理动作需要注意的是:要用括号把查找条件和后面的处理动作分开。如我们改成这样:

[root@localhost tmp]# find / \( -nogroup -o -nouser \) -ls
find: ‘/proc/2495/task/2495/fd/6’: No such file or directory
find: ‘/proc/2495/task/2495/fdinfo/6’: No such file or directory
find: ‘/proc/2495/fd/6’: No such file or directory
find: ‘/proc/2495/fdinfo/6’: No such file or directory
 92910    0 drwx------   2 root     4004            6 Dec 12 04:57 /var/db/sudo/sst
 29863    0 -rw-r--r--   1 root     4007            0 Dec 13 00:29 /var/html/dex.html
  1089    0 -rw-rw-r--   1 4024     4024            0 Dec 20 17:02 /tmp/test1
  1118    0 -rw-rw-r--   1 4024     4024            0 Dec 20 17:02 /tmp/test2

现在正常了,还是我们上面查找到的四个文件。可以看到文件的详细信息了。

上面要用转义符\把每个括号转义,或者用单引号把每个括号括起来也行,还有里面的处理条件与括号之间要有空格。


3、基于文件类型查找:

例:查找块设备

[root@localhost tmp]# find /dev -type b -ls
 10323    0 brw-rw----   1 root     disk       8,   6 Dec 20 16:43 /dev/sda6
 10322    0 brw-rw----   1 root     disk       8,   5 Dec 20 16:43 /dev/sda5
 10321    0 brw-rw----   1 root     disk       8,   4 Dec 20 16:43 /dev/sda4
 10320    0 brw-rw----   1 root     disk       8,   3 Dec 20 16:43 /dev/sda3
 10319    0 brw-rw----   1 root     disk       8,   2 Dec 20 16:43 /dev/sda2
 10318    0 brw-rw----   1 root     disk       8,   1 Dec 20 16:43 /dev/sda1
 10291    0 brw-rw----   1 root     disk       8,   0 Dec 20 16:43 /dev/sda
 10284    0 brw-rw----   1 root     cdrom     11,   0 Dec 20 16:43 /dev/sr0

例:查找套接字文件。

[root@localhost tmp]# find / -type s -ls
  1519    0 srw-rw-rw-   1 root     root            0 Dec 20 16:43 /dev/log
find: ‘/proc/2525’: No such file or directory
 17019    0 srwxrwxrwx   1 root     root            0 Dec 20 16:43 /run/NetworkManager/private-dhcp
 16885    0 srwxrwxrwx   1 root     root            0 Dec 20 16:43 /run/NetworkManager/private
 16364    0 srw-rw-rw-   1 root     root            0 Dec 20 16:43 /run/abrt/abrt.socket
 15243    0 srw-rw-rw-   1 root     root            0 Dec 20 16:43 /run/dbus/system_bus_socket
 15238    0 srw-rw-rw-   1 root     root            0 Dec 20 16:43 /run/rpcbind.sock
.....


4、基于文件大小查找:

-size #

例:

[root@localhost ~]# find /usr -size 10M -ls
68527014 9676 -rwxr-xr-x   1 root     root      9905672 Jun 10  2014 /usr/lib64/python2.7/site-packages/PyKDE4/kdeui.so
102690836 9792 -rw-r--r--   1 root     root     10024702 Jan 15  2015 /usr/lib64/firefox/omni.ja

这两个文件都是在10M单位大小的,也就是大于9M而小于等于10M。单位是M,它的单位大小就是M。

这个显示的大小看起来不怎么直观呃,如果单位大小可以显示更直观就好了。那么我们可以在后面附加上我们想要后续处理的命令。这里先了解一下使用方式。到后面我们再说它。

关键字:-exec和-ok。

固定格式, -exec COMMAND {} \;

[root@localhost ~]# find /usr -size 10M -exec ls -lh {} \;
-rwxr-xr-x. 1 root root 9.5M Jun 10  2014 /usr/lib64/python2.7/site-packages/PyKDE4/kdeui.so
-rw-r--r--. 1 root root 9.6M Jan 15  2015 /usr/lib64/firefox/omni.ja

这里可以很清楚的看到它的大小。9.5M,9.6M。都在10的1M单位大小内。


-size -#

那么现在可以看看小于指定单位大小了。因为要看的直观点,所以上面的-exec会一直加上。我把我这里要实验的目录下的所有文件先贴出来。我们就以8M为基准来做实验。

[root@localhost test]# ll -h | sort -n -k 5
total 122M
-rw-r--r-- 1 root root 5.9M Dec 20 18:27 h.img
-rw-r--r-- 1 root root 6.9M Dec 20 18:30 v.img
-rw-r--r-- 1 root root 7.0M Dec 20 18:28 y.img
-rw-r--r-- 1 root root 7.5M Dec 20 18:29 m.img
-rw-r--r-- 1 root root 7.9M Dec 20 18:26 d.img
-rw-r--r-- 1 root root 8.0M Dec 20 18:25 a.img
-rw-r--r-- 1 root root 8.3M Dec 20 18:27 i.img
-rw-r--r-- 1 root root 8.8M Dec 20 18:26 f.img
-rw-r--r-- 1 root root 9.0M Dec 20 18:25 b.img
-rw-r--r-- 1 root root 9.4M Dec 20 18:26 g.img
-rw-r--r-- 1 root root 9.8M Dec 20 18:38 k.img
-rw-r--r-- 1 root root  10M Dec 20 18:38 j.img
-rw-r--r-- 1 root root  11M Dec 20 18:28 z.img
-rw-r--r-- 1 root root  12M Dec 20 18:28 x.img
-rw-r--r-- 1 root root  146 Dec 18 20:38 ou.sh
-rw-r--r-- 1 root root  630 Dec 18 21:11 line.sh

现在要查找小于8M的文件,先来尝试一下。

这里有个小坑,在只指定目录,而不是目录中所有文件的情况下,会把目录也计算进去。而我们在尝试小于某大小的情况下,因为目录也符合条件,所以目录下所有文件都会显示出来。如这样(我这里用-ok来每一步都要确认,来看看过程):

[root@localhost test]# find /root/test/ -size -8M -ok ls -lh {} \;
< ls ... /root/test/ > ? y            #这里就是问题了,区配到了目录,ls一个目录的结果。
total 122M
-rw-r--r-- 1 root root 8.0M Dec 20 18:25 a.img
-rw-r--r-- 1 root root 9.0M Dec 20 18:25 b.img
-rw-r--r-- 1 root root 7.9M Dec 20 18:26 d.img
-rw-r--r-- 1 root root 8.8M Dec 20 18:26 f.img
-rw-r--r-- 1 root root 9.4M Dec 20 18:26 g.img
-rw-r--r-- 1 root root 5.9M Dec 20 18:27 h.img
-rw-r--r-- 1 root root 8.3M Dec 20 18:27 i.img
-rw-r--r-- 1 root root  10M Dec 20 18:38 j.img
-rw-r--r-- 1 root root 9.8M Dec 20 18:38 k.img
-rw-r--r-- 1 root root  630 Dec 18 21:11 line.sh
-rw-r--r-- 1 root root 7.5M Dec 20 18:29 m.img
-rw-r--r-- 1 root root  146 Dec 18 20:38 ou.sh
-rw-r--r-- 1 root root 6.9M Dec 20 18:30 v.img
-rw-r--r-- 1 root root  12M Dec 20 18:28 x.img
-rw-r--r-- 1 root root 7.0M Dec 20 18:28 y.img
-rw-r--r-- 1 root root  11M Dec 20 18:28 z.img
< ls ... /root/test/h.img > ? y            #这里才开始目录里的文件。
-rw-r--r-- 1 root root 5.9M Dec 20 18:27 /root/test/h.img
< ls ... /root/test/line.sh > ? y
-rw-r--r-- 1 root root 630 Dec 18 21:11 /root/test/line.sh
< ls ... /root/test/ou.sh > ?


解决小坑,再来尝试看。

[root@localhost test]# find /root/test/* -size -8M -exec ls -lh {} \;
-rw-r--r-- 1 root root 5.9M Dec 20 18:27 /root/test/h.img
-rw-r--r-- 1 root root 630 Dec 18 21:11 /root/test/line.sh
-rw-r--r-- 1 root root 146 Dec 18 20:38 /root/test/ou.sh
-rw-r--r-- 1 root root 6.9M Dec 20 18:30 /root/test/v.img
-rw-r--r-- 1 root root 7.0M Dec 20 18:28 /root/test/y.img

来看一下匹配到的结果。这就是小于8M单位大小的结果,从7M开始的。因为8M的单位大小就是大于7M而小于等于8M的。


-size +#

这个就简单了,就是我们所以为的大于。

[root@localhost test]# find /root/test/* -size +8M -exec ls -lh {} \;
-rw-r--r-- 1 root root 9.0M Dec 20 18:25 /root/test/b.img
-rw-r--r-- 1 root root 8.8M Dec 20 18:26 /root/test/f.img
-rw-r--r-- 1 root root 9.4M Dec 20 18:26 /root/test/g.img
-rw-r--r-- 1 root root 8.3M Dec 20 18:27 /root/test/i.img
-rw-r--r-- 1 root root 10M Dec 20 18:38 /root/test/j.img
-rw-r--r-- 1 root root 9.8M Dec 20 18:38 /root/test/k.img
-rw-r--r-- 1 root root 12M Dec 20 18:28 /root/test/x.img
-rw-r--r-- 1 root root 11M Dec 20 18:28 /root/test/z.img


5、基于文件的访问、修改时间查找:

这个跟上面的文件大小一样也是以单位大小为单位。只有两种单位,以天和以分钟为单位。我这里还是刚才的那些文件,把时间改了一下。

[root@localhost test]# date
Sun Dec 20 11:59:27 CST 2015
[root@localhost test]# ls -lh --time=access | sort -n -k 7
total 87M
-rw-r--r-- 1 root root 5.9M Dec 11 07:45 h.img
-rw-r--r-- 1 root root 7.0M Dec 12 23:44 y.img
-rw-r--r-- 1 root root 8.8M Dec 12 03:45 f.img
-rw-r--r-- 1 root root  12M Dec 14 05:44 x.img
-rw-r--r-- 1 root root    0 Dec 15 11:43 c.img
-rw-r--r-- 1 root root  11M Dec 16 07:43 z.img
-rw-r--r-- 1 root root    0 Dec 17 03:43 e.img
-rw-r--r-- 1 root root 9.8M Dec 17 13:43 k.img
-rw-r--r-- 1 root root  146 Dec 18 21:12 ou.sh
-rw-r--r-- 1 root root 7.9M Dec 19 05:41 d.img
-rw-r--r-- 1 root root 9.0M Dec 19 15:41 b.img
-rw-r--r-- 1 root root 6.9M Dec 20  2015 v.img
-rw-r--r-- 1 root root 8.0M Dec 20 11:40 a.img

注意时间部分“天”。我这里当前时间是20号,中午12点。

-atime #

查找一下昨天访问过的文件。

[root@localhost test]# find ./* -atime 1 -exec ls -lh --time=access {} \;
-rw-r--r-- 1 root root 7.9M Dec 19 05:41 ./d.img
-rw-r--r-- 1 root root 146 Dec 18 21:12 ./ou.sh

结果诡异,但是正确。24小时以前的24小时。

如果是查找最近24小时的,可以用-atime -1也可以用-atime 0。

查找一下最近24小时访问过的。

[root@localhost test]# find ./* -atime 0 -exec ls -lh --time=access {} \;
-rw-r--r-- 1 root root 8.0M Dec 20 11:40 ./a.img
-rw-r--r-- 1 root root 9.0M Dec 19 15:41 ./b.img


-atime -#

这个用起来就简单了,直接就是多少天以内的时间。

如一周以内访问过的。

[root@localhost test]# find ./* -atime -7 -exec ls -lh --time=access {} \; | sort -k 7
-rw-r--r-- 1 root root 12M Dec 14 05:44 ./x.img
-rw-r--r-- 1 root root 0 Dec 15 11:43 ./c.img
-rw-r--r-- 1 root root 11M Dec 16 07:43 ./z.img
-rw-r--r-- 1 root root 0 Dec 17 03:43 ./e.img
-rw-r--r-- 1 root root 9.8M Dec 17 13:43 ./k.img
-rw-r--r-- 1 root root 146 Dec 18 21:12 ./ou.sh
-rw-r--r-- 1 root root 7.9M Dec 19 05:41 ./d.img
-rw-r--r-- 1 root root 9.0M Dec 19 15:41 ./b.img
-rw-r--r-- 1 root root 8.0M Dec 20 11:40 ./a.img
-rw-r--r-- 1 root root 6.9M Dec 20  2015 ./v.img


-atime +#

多少天以前。

如3天以前修改过的。

[root@localhost test]# find ./* -mtime +3 -exec ls -lh {} \; | sort -k 7
-rw-r--r-- 1 root root 5.9M Dec 11 07:45 ./h.img
-rw-r--r-- 1 root root 8.8M Dec 12 03:45 ./f.img
-rw-r--r-- 1 root root 7.0M Dec 12 23:44 ./y.img
-rw-r--r-- 1 root root 12M Dec 14 05:44 ./x.img
-rw-r--r-- 1 root root 0 Dec 15 11:43 ./c.img
-rw-r--r-- 1 root root 11M Dec 16 07:43 ./z.img

注意:不包括3天前的一天。如果想要包括就要从2天前开始。

[root@localhost test]# find ./* -mtime +2 -exec ls -lh {} \; | sort -k 7
-rw-r--r-- 1 root root 5.9M Dec 11 07:45 ./h.img
-rw-r--r-- 1 root root 8.8M Dec 12 03:45 ./f.img
-rw-r--r-- 1 root root 7.0M Dec 12 23:44 ./y.img
-rw-r--r-- 1 root root 12M Dec 14 05:44 ./x.img
-rw-r--r-- 1 root root 0 Dec 15 11:43 ./c.img
-rw-r--r-- 1 root root 11M Dec 16 07:43 ./z.img
-rw-r--r-- 1 root root 0 Dec 17 03:43 ./e.img

现在是20号。上面多了一个17号。朋友们自己琢磨吧。

相关的用法都一样,其它的这里就不举例了。


6、基于文件权限查找:

简单的使用:

-perm mode:

例:精确查找属主rwx,属组rwx,其它用户也是rwx的文件。因为符号链接文件都是这个权限,所以我们把符号排除。

[root@localhost ~]# find / -perm 777 -a ! -type l -ls
find: ‘/proc/5575/task/5575/fdinfo/6’: No such file or directory
find: ‘/proc/5575/fdinfo/6’: No such file or directory
 17019    0 srwxrwxrwx   1 root     root            0 Dec 20  2015 /run/NetworkManager/private-dhcp
 16885    0 srwxrwxrwx   1 root     root            0 Dec 20  2015 /run/NetworkManager/private
  9923    0 srwxrwxrwx   1 root     root            0 Dec 20  2015 /run/systemd/private

系统上面的普通文件好像也没有这个权限。找到了三个socket文件。上面的-a可以省略。变成下面这个:

[root@localhost ~]# find / -perm 777 ! -type l -ls

结果是一样的。


-perm -mode:

例:查找所有用户都可以写的文件。因为内容太多了,所以只贴出来一部分。

 [root@localhost test]# find / -perm -222 -ls
 14579    0 crw-rw-rw-   1 root     root      10, 200 Dec 20  2015 /dev/net/tun
 14576    0 crw-rw-rw-   1 root     root      10, 229 Dec 20  2015 /dev/fuse
  1127    0 drwxrwxrwt   2 root     root           40 Dec 20  2015 /dev/mqueue
  1519    0 srw-rw-rw-   1 root     root            0 Dec 20  2015 /dev/log
  1289    0 drwxrwxrwt   2 root     root           40 Dec 20  2015 /dev/shm
  1129    0 crw-rw-rw-   1 root     tty        5,   2 Dec 20  2015 /dev/ptmx
  1047    0 crw-rw-rw-   1 root     tty        5,   0 Dec 20  2015 /dev/tty

只要都有写权限就可以。222就是这个样子,_w__w__w_与上面权限部分做与运算。这样最终结果肯定是都有写权限的了。


-perm /mode:

在CentOS6或以前的版本中/mode是+mode。只要其中一位权限可以匹配即可。

例:

[root@localhost test]# find ./* -perm /777 -exec ls -lh {} \;
-----w---- 1 root root 9.8M Dec 17 13:43 ./k.img
-rw-r--r-- 1 root root 146 Dec 18 20:38 ./ou.sh
-------r-- 1 root root 12M Dec 14 05:44 ./x.img
---------x 1 root root 7.0M Dec 12 23:44 ./y.img
-r-------- 1 root root 11M Dec 16 07:43 ./z.img

只要其中有任何一位可以匹配就可以,上面的777包含了所有的基本权限,除非文件没有任何权限,不然都会匹配。

如,当前目录下面的这个文件没有匹配:

---------- 1 root root  7168000 Dec 20  2015 v.img


上面这些就是基本的用法,而这个地方,最麻烦的就是组合测试了,如,查询所有用户都没有写权限的。要加上逻辑非,但关键是要与哪些权限非呢。

我们就以所有用户都没有写权限为例试一下。大家可以想想看,以哪些权限为非呢。

[root@localhost test]# find . ! -perm /222 -ls
100674035 7000 ----------   1 root     root      7168000 Dec 20  2015 ./v.img
100674031 12288 -------r--   1 root     root     12582912 Dec 14 05:44 ./x.img
100674032 7168 ---------x   1 root     root      7340032 Dec 12 23:44 ./y.img
100674030 11264 -r--------   1 root     root     11534336 Dec 16 07:43 ./z.img

首先我们来匹配,只要有写权限就可以。就是/222了。而一个文件只要有写权限就可以的反过来不就是上面那个喽。

如果是-222就不对了,因为这是所有用户都有写权限的意思,反过来以后就是不匹配所有用户都有写权限的。

[root@localhost test]# find ./* ! -perm -222 -exec ls -lh {} \;
-----w---- 1 root root 9.8M Dec 17 13:43 ./k.img
-rw-r--r-- 1 root root 146 Dec 18 20:38 ./ou.sh
---------- 1 root root 6.9M Dec 20  2015 ./v.img
-------r-- 1 root root 12M Dec 14 05:44 ./x.img
---------x 1 root root 7.0M Dec 12 23:44 ./y.img
-r-------- 1 root root 11M Dec 16 07:43 ./z.img



三、综合举例

接着上面的来。

1、查找/etc目录下所有用户都有执行权限,并且其它用户还有写权限的文件,指定普通文件。

[root@localhost test]# find /etc -perm -111 -a -perm -002 -a -type f -ls

上面的权限部分可以组合起来。

[root@localhost test]# find /etc -perm -113 -a -type f -ls
   385    0 -r-xr-x-wx   1 root     root            0 Dec 17 04:15 /etc/rc.d/init.d/abc

手动建立的文件,正常情况下/etc目录下没有这样的文件。

2、查找系统上有特殊权限的文件,如:SUID,SGID,Sticky Bit的权限。

[root@localhost ~]# find /usr/bin/ -perm /7000 -ls
153760   16 -r-xr-sr-x   1 root     tty         15344 Jun 10  2014 /usr/bin/wall
316794   20 -rwxr-sr-x   1 root     tty         19536 Mar  6  2015 /usr/bin/write
316769   44 -rwsr-xr-x   1 root     root        44232 Mar  6  2015 /usr/bin/mount
313434   64 -rwsr-xr-x   1 root     root        64200 Mar  6  2015 /usr/bin/chage
313435   80 -rwsr-xr-x   1 root     root        78168 Mar  6  2015 /usr/bin/gpasswd
316784   32 -rwsr-xr-x   1 root     root        32064 Mar  6  2015 /usr/bin/su
313437   44 -rwsr-xr-x   1 root     root        41752 Mar  6  2015 /usr/bin/newgrp
316737   24 -rws--x--x   1 root     root        23960 Mar  6  2015 /usr/bin/chfn
316739   24 -rws--x--x   1 root     root        23856 Mar  6  2015 /usr/bin/chsh
316788   32 -rwsr-xr-x   1 root     root        31960 Mar  6  2015 /usr/bin/umount
681389   28 -rwsr-xr-x   1 root     root        27832 Jun 10  2014 /usr/bin/passwd
.....

我们所熟知的特殊权限文件passwd就在里面。

只显示SUID的。

[root@localhost ~]# find /usr/bin/ -perm /4000 -ls
316769   44 -rwsr-xr-x   1 root     root        44232 Mar  6  2015 /usr/bin/mount
313434   64 -rwsr-xr-x   1 root     root        64200 Mar  6  2015 /usr/bin/chage
313435   80 -rwsr-xr-x   1 root     root        78168 Mar  6  2015 /usr/bin/gpasswd
316784   32 -rwsr-xr-x   1 root     root        32064 Mar  6  2015 /usr/bin/su
313437   44 -rwsr-xr-x   1 root     root        41752 Mar  6  2015 /usr/bin/newgrp
316737   24 -rws--x--x   1 root     root        23960 Mar  6  2015 /usr/bin/chfn
316739   24 -rws--x--x   1 root     root        23856 Mar  6  2015 /usr/bin/chsh
316788   32 -rwsr-xr-x   1 root     root        31960 Mar  6  2015 /usr/bin/umount
681389   28 -rwsr-xr-x   1 root     root        27832 Jun 10  2014 /usr/bin/passwd
.....

现在才发现原来系统上面的特殊权限的命令有这么多啊。


3、查找没有属主属组并且最近1周还被访问过的文件。

[root@localhost ~]# find / -nouser -a -nogroup -a -atime -7 -ls
find: ‘/proc/9451/task/9451/fd/6’: No such file or directory
find: ‘/proc/9451/task/9451/fdinfo/6’: No such file or directory
find: ‘/proc/9451/fd/6’: No such file or directory
find: ‘/proc/9451/fdinfo/6’: No such file or directory
  1089    0 -rw-rw-r--   1 4024     4024            0 Dec 20  2015 /tmp/test1
  1118    0 -rw-rw-r--   1 4024     4024            0 Dec 20  2015 /tmp/test2


4、查找不属于root,bin,sst用户的文件。

[root@localhost ~]# find / ! \( -user root -o -user bin -o -user sst \) -ls
67219817    4 -rw-r--r--   1 hadoop   hadoop        193 Mar  6  2015 /home/hadoop/.bash_profile
67219818    4 -rw-r--r--   1 hadoop   hadoop        231 Mar  6  2015 /home/hadoop/.bashrc
  1089    0 -rw-rw-r--   1 4024     4024            0 Dec 20  2015 /tmp/test1
  1118    0 -rw-rw-r--   1 4024     4024            0 Dec 20  2015 /tmp/test2
.....

与下面这个一个意思:

[root@localhost ~]# find / ! -user root -a ! -user bin -a ! -user sst -ls


5、当前目录下的所有文件名称重命名为 原来的名子+er。

[root@localhost ~]# ls
a  b  c  d  e  f  g  test
[root@localhost ~]# find ./* -exec mv {} {}er \;
find: ‘./test’: No such file or directory
[root@localhost ~]# ls
aer  ber  cer  der  eer  fer  ger  tester


补充--exec:

处理动作那里的 -exec和-ok 的格式说明一下。这两个其本一样,下面就以--exec来说明。

大括号{}代表的是前面所查找到的数据。 最后的右斜杠和分号 \; 是因定的格式。


find在查找到所有数据以后,会一次性的交给--exec右边的命令来执行。在数据量很大的时候,可能会报参数溢出或过长错误之类的问题。这时可以用xargs代替find的-exec。



结尾:

需要注意的:

1、条件与处理动作之间 有时间需要括号隔开。一般是只有条件,而条件没有值的情况。

2、查询的如果是目录,目录也会匹配在内。

更多的方式:

http://os.51cto.com/art/200908/141119_all.htm



谢谢大家,如果有什么问题,请尽管提出,大家共同学习。 如果发现有什么错误或不妥的地方,也请给个提示,我会积极改进的,谢谢。

本文出自 “大蕃茄” 博客,请务必保留此出处http://fanqie.blog.51cto.com/9382669/1726542

find详解

原文:http://fanqie.blog.51cto.com/9382669/1726542

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!