Find命令使用详解
Find是Linux中查找文件的命令,“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
根据UID、GID查找:
-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时,那么9k到10k之间的都会被默认为10k;如果条件为+10k则表示所有大于10k的文件;如果条件为-10k则表示所有小于10k的文件。格式为:find /etc -size 10k、find /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目录下最近一周内内容修改过且不属于root及student用户的文件;
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