之前学过的grep,egrep,sed都是文本查找的相关命令,用来查找字符串的。 现在学习一下关于文件查找的命令。 文件查找: locate: 非实时的,模糊匹配,查找是根据全系统文件数据库进行的;系统的数据库每天都会更新; updatedb命令, 手动生成文件数据库; 优势是速度快,了解一下就可以了,文件查找主要使用find命令。
-
find: 实时,精确,支持众多查找标准; 通过遍历指定目录中的所有文件完成查找,所以速度慢;
-
用法:find 查找路径 查找标准 查找到以后的处理运作 查找路径:可以省略,默认为当前目录 查找标准:可以省略,默认为指定路径下的所有文件 处理运作:可以省略,默认为显示 如果直接执行find命令,就会显示当前目录下的所有文件,包括子目录。
-
匹配标准:通过选项指定 -name 'FILENAME':根据文件名作精确匹配,注意文件名要加引号! 文件名通配:比如 find /etc -name 'passwd匹配在/etc下文件名有passwd的文件 *:任意长度的任意字符 ?:任意单个字符 [ ]:指定范围内的任意单个字符 -iname 'FILENAME': 文件名匹配时不区分大小写 -regex PATTERN:基于正则表达式进行文件名匹配,PATTERN是正则表达式的模式;
-user USERNAME: 根据属主查找,查找属于某个属主的文件。 -group GROUPNAME: 根据属组查找
-uid UID: 根据UID查找 -gid GID: 根据GID查找
-nouser:查找没有属主的文件 -nogroup: 查找没有属组的文件
-type 根据文件类型查找 f:普通文件 d:目录 c:字符 b:块设备 l:链接 p:管道 s:链接
-size :根据文件大小查找,通常是一个数字加一个单位符。 [+|-]#k:+10k 就是大于10k [+|-]#M:-10M就是小于10M [+|-]#G:同上一样,如果不加+ - 号就是精确正好
-
组合条件(一次完成多个条件): -a:与;两个条件同时满足比如:find /tmp -nouser -a -type d -o:或;满足一个条件 -not :非
-
根据时间戳查找: -mtime:修改时间(单位是天) -ctime:改变时间 -atime:访问时间 上面三个后面都可以加+ - 后面附数字,比如5表示距离今天正好五天访问过,-5表示至少这五天访问了,+5表示至少五天没访问了。 -mmin:修改时间(单位是分钟) -cmin:改变时间 -amin:访问时间 [+|-]# 和上面的一样 比如:find /tmp -atime +5
-
根据权限查找: -perm MODE:精确匹配 /MODE: 任意一位匹配即满足条件 -MODE: 精确匹配;文件权限能完全包含此MODE时才符合条件 内部有或和与逻辑比如:-001意思是其他组必须有执行权限的才匹配,其他的权限有没有无所谓。/022表示组有写权限或者其他组有写权限的都可以匹配。 例如:find /tmp -perm -007 这表示文件的其他组有读写执行权限的文件都匹配,属主和属组的权限无所谓是什么。
- 运作: 默认-print: 显示 -ls:类似ls -l的形式显示每一个文件的详细 -ok COMMAND {} ; 反斜线分号结尾,{}作为文件名称占位符;每一次操作都需要用户确认 -exec COMMAND {} ; 和上一个ok用法一样;只是每一次操作不需要用户确认。 比如: find ./ -perm -006 -exec chmod o-w {} ; 找到其他用户可读可写的文件,将他的写权限去掉chmod o-w是命令{}表示引用你找到的文件。 find ./ -perm -020 -exec mv {} {}.new ; 找到属组有写权限的文件将他的名字改为原来的名字后面加.new,因为单纯用mv命令应该这样写mv name name.new,所以{}出现两次。只要引用文件名就要加{}。