您的位置:首页 > 运维架构 > Linux

2015.11.07_07_03_Linux文件查找详解

2015-11-07 23:53 344 查看
grep,egrep,fgrep是查找文本的,是查找字符串的。

它能在文件中查找文本。

而文件查找则需要别的工具:
locate
find


locate
: 在全系统查找文件,非实时,因为它的查找是根据
全系统文件数据库
完成的。linux系统只要在运行,它每天都会运行一个计划任务,该任务会把系统中所有的文件名保存到一个数据库中。而locate就是在该数据库中查找文件,并且是模糊查找,只需要文件的全路径名中包括要找的文件名,就算匹配。该数据库,也可以通过执行命令手动生成:
updatedb
。它会收集系统中所有文件的信息。因为它是直接在数据库中查找,所以它的速度快。

但是因为它的非实时性及模糊性,这个命令用的并不多。

find
: 实时、精确、遍历指定目录中所有文件完成查找,速度慢。

而且find支持众多的查找标准,比如根据文件名查找,根据文件权限查找、根据文件类型查找,还能根据正则表达式匹配文件名。

命令格式:

find
查找路径 查找标准 查找到以后的处理运作

查找路径
:可以省略,省略则表示当前目录。

查找标准
:默认为指定路径下的所有文件。

处理运行
:默认为显示文件的路径

例如:在当前目录下运行find,则会把当前目录下的文件,包括隐藏文件全部列出来。

查找路径

查找路径比较简单,而查找标准则很复杂。

查找规则

查找标准也叫匹配规则:

-name ‘filename’ : 对文件名做精确查找。查找文件名为指定名称的文件,必须要求文件名完全匹配,且区分大小写。

如:

[root@redhat5u5 ~]# find /etc -name ‘passwd’

/etc/uucp/passwd

/etc/passwd

/etc/pam.d/passwd

当然它也支持通配符:

*: 任意长度的任意字符,包括0个字符。

?: 匹配1个字符。

[]: 匹配中括号中的任意一个字符

-iname ‘filename’: 文件名匹配时不区分大小写。

-regex PATTERN : 基于正则表达式进行文件名匹配。

-user username : 根据文件是属于哪个user来查找

-group groupname: 根据属组查找

-uid UID : 根据UID查找

-gid GID: 根据GID查找

-nouser : 查找没有属主的文件

-nogroup:查找没有属组的文件

-type 根据文件类型查找

f: 普通文件

d: 目录

c: 字符设备

b: 块设备

l: 链接文件

p: 管道设备

s: 套接字设备

如:find -type d

-size 指定文件大小查找

查找的时候,-size后面跟着文件大小的数字和单位,M表示兆,G表示GB,小写的k表示kB,不跟单位的话,则表示字节。如:-size xxM

还可以添加[+|-]在数字的前面,表示大于还是小于指定的指定的大小。如:-size +xxM

find /etc -size 1M
这个命令会找到很多不是1M大小的文件。这是因为,零点几M的文件,会被当做1M的文件。比如找10M的文件,那么9点几M的文件,会被当做10M的。

而在find命令后面,添加-ls 会列出查找到的文件的详细信息。

find /etc -size 10k -ls

2941988 16 -rw-r–r– 1 root root 9260 Feb 12 2009 /etc/htdig/htdig.conf

2940747 16 -rw-r–r– 1 root root 9828 Mar 12 2010 /etc/pki/tls/openssl.cnf

2941394 16 -rw-r–r– 1 root root 9260 Oct 7 2006 /etc/pam_pkcs11/pam_pkcs11.conf

2940636 16 -rwxr-xr-x 1 root root 9966 Nov 19 2009 /etc/rc.d/init.d/cpuspeed

2942773 16 -rw-r–r– 1 root root 9832 Oct 19 2006 /etc/gconf/schemas/gconf-editor.schemas

2941254 16 -rw-r–r– 1 root root 9733 Jan 23 2010 /etc/samba/smb.conf

2942452 16 -rw-r–r– 1 root root 9685 Jan 7 2010 /etc/xdg/autostart/puplet.desktop

以上条件,还可以进行组合

-a


-o


-not


如果给定了2个条件,而没有给定组合方式,默认是
逻辑。

组合参数要放在2个条件之间:
find /etc -nouser -o -type d


-not
要放在条件之前,比如非目录的:
find /etc -not -type d


把2个非 再与起来的操作:find /tmp
-not -type d
-a
-not -type s


组合这些条件,也可以使用括号:

find /tmp -not \(-user user1 -o -user user2\)


括号要使用反斜杠进行转义。

根据文件的时间戳查找:

-mtime:修改时间

-ctime: 改变时间

-atime: 访问时间

这3个参数后面跟数字,表示天。而且可以使用[+|-]在天数之前。如果不使用+-,则表示离今天刚好5天,
+
号表示5天之前,也就是离现在至少5天了,大于5天,
-
号表示5天以内,少于5天。

与此对应的,还有表示分钟的一组参数:

-mmin

-cmin

-amin

-perm MODE : 根据权限查找,精确匹配mode,每一位都要匹配上,权限共有9位。

还有+mode,-mode,/mode。+mode和/mode表示一个意思。

find ./ -perm 644

/mode
:只要有一位匹配就好,任意一位满足条件。
find ./ -perm /644


-mode
:每一位都必须匹配,文件权限能完全包含此MODE时才能显示。

find ./ -perm -001 : 查找其他用户有执行权限的文件

动作

-print : 默认是显示出来

-ls: 类似ls -l的形式显示每一个匹配到的文件

-ok COMMAND \; COMMAND表示要执行的命令,并且必须要以
\;
结尾,否则被认为语法错误。

如果需要引用这个文件的话,则使用{}表示占位符:-ok COMMOND {} \;

-exec COMMAND {} \; 同上,区别是,-ok 的每一个命令,都需要用户确认。

find ./ -perm -004 -exec chmod o-w {} \;


find ./ -name "*.sh" -a -perm -111 -exec chmode o-x {} \;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: