Find命令使用详解

FindLinux中查找文件的命令,“find”命令能帮助我们在使用,管理Linux的日常事务中方便的查找出我们需要的文件。

Find 命令的特点:实时精确支持众多查找标准遍历指定目录中的所有文件完成查找,速度慢;

Find 命令的格式:find  查找路径 查找标准 查找到以后的处理运作

查找路径:默认为当前目录

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

处理运作:默认为显示

Find匹配标准:

       通过文件名查找

    -name 'FILENAME':对文件名作精确匹配

    如:查找/etc目录下的passwd这样的文件,命令为:find /etc -name 'passwd'  

使用-name对文件名查找的时候还支持对文件名的通配

文件名通配*任意长度的任意字符?”任意单个字符、[]”匹配指定范围内的任意单个字符,等等

如:查找/etc目录下以passwd结尾的文件,命令为:find /etc -name '*passwd' ,这样在/etc目录下以passwd这几个字母结尾的所有文件都会被显示出来

查找/etc目录下以passwd开头的文件,命令为:find /etc -name 'passwd*'

-iname 'FILENAME': 文件名匹配时不区分大小写

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

 

    根据属主、属组查找

-user USERNAME

如:查找在/tmp目录下属主属于root的用户,命令为:find /tmp -user root

-group GROUPNAME

如:查找在/tmp目录下属组属于root的用户,命令为:find /tmp -group root

 

根据UIDGID查找

-uid UID -gid GID

如果某个用户被删,那么以前所有属于这个用户的文件的的属主都会变成此前这个用户的ID号,因此这个时候再根据这个属主就找不到这样的文件了,此时只能根据它的ID号来查找。如:find /tmp -uid 2003  这样就会把ID号为2003的给查找出来。

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

    如:find /tmp -nouser   查找/tmp目录下没有属主的用户

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

如:find /tmp -nogroup   查找/tmp目录下没有属组的用户

 

根据文件类型来查找:

-type 

f: 普通文件d目录文件b: 块设备文件 (block)c: 字符设备文件 (character)l: 符号链接文件(symbolic link file)p: 命令管道文件(pipe)s: 套接字文件(socket)

如:我们查找一下/tmp目录下的目录文件,命令为:find /tmp -type d 

    

    根据文件的大小来查找:

    -size 

通常情况下-size后面都会跟一些数字和单位如:#k#M#G,如不跟单位默认为字节,这些数字还可以用+-号来修饰,如:+10k-10k,意思是大于10k、小于10k,如果不带+-号则表示精确为10k。如果我们查找条件为10k时,那么9k10k之间的都会被默认为10k;如果条件为+10k则表示所有大于10k的文件;如果条件为-10k则表示所有小于10k的文件。格式为:find /etc -size 10kfind /etc -size +10k find /etc -size -10k

    

       组合条件:

-a (与)、-o (或)、-not(非)

    如:我们找一找/tmp目录下没有属主并且类型为目录的文件

命令则是 find /tmp -nouser -a -type d  这里就用到了-a(与),如果把-a改为-o则表示/tmp目录下没有属主或者类型为目录的文件,两个条件满足一个即可。如果要查找不是目录的文件只需在前面加-not即可。如:find /tmp -not -type d  

    根据文件的时间戳来查找:

-mtime修改时间)、-ctime改变时间)、-atime访问时间),后面跟数字,数字前面还可以用+-号来修饰。如:“-atime 5”表示离此刻为止刚好五天访问过“-atime +5”表示至少有五天没有访问过了、“-atime -5”表示五天之内访问过。还有另外一组(-mmin-cmin-amin)此用法一样只是表示的时间为分钟,(‘time’表示天、‘min’表示分钟)。

如:查找/tmp 目录下在五天之内被访问过的文件,即:find /tmp -atime -5   

 

根据文件的权限来查找:

-perm MODE

-perm MODE:精确匹配

-perm /MODE: 任意一位匹配即满足条件

    -perm -MODE: 文件权限能完全包含此MODE时才符合条件

如:我们查找当前目录下文件权限为644的文件,即:find ./ -perm 644

    运作:

  -print: 显示

-ls:类似ls -l的形式显示每一个文件的详细

    如果我们想在查找到的文件上执行其他的命令则用到下面的命令:

-ok COMMAND {} \; 每一次操作都需要用户确认,也可以用-exec COMMAND {} \;

    如果我们要操作那个文件,并在这个命令格式中需要引用那个文件的话就要使用{}作为文件名称占位符。

    在这里强调一点一定要引用“\;”结尾,否则为语法错误

如:在当前目录下找到其他用户能够读写的用户,把这些用户的写权限给去掉

find / -perm -006 -exec chmod o-w {} \;  “{}”是引用查找到的文件 

 

下面是几个练习题:

1、查找/var目录下属主为root并且属组为mail的所有文件;

find /var -user root -group mail

2、查找/usr目录下不属于root,bin,student的文件;

find /usr -not -user root -a -not -user bin -a -not -user student

find /usr -not \( -user root -o -user bin -o -user student \)

3、查找/etc目录下最近一周内内容修改过且不属于rootstudent用户的文件;

find /etc -mtime -7 -not \ ( -user root -o -user student \)

find /etc -mtime -7 -not -user root -a -not -user student

4、查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root

find \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \; 

5、查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中;

find /etc -size +1M >> /tmp/etc.largefiles

6、查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;

find /etc -not -perm /222 -ls