文件查找

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件查找相关的知识,希望对你有一定的参考价值。

文件查找工具有这两种 :1、locate :非实时查找(数据库查找)2、find: 实时查找。

1、locate :非实时查找(数据库查找)

工作特点: 
?查找速度快
?模糊查找 
?非实时查找 
?搜索的是文件的全路径,不仅仅是文件名
?可能只搜索用户具备读取和执行权限的目录
数据文件位置 :/var/lib/mlocate/mlocate.db
更新数据文件方法 :updatadb
索引构建过程需要遍历整个根文件系统,极消耗资源 ,生产中不建议全盘搜索,太消耗资源
locate KEYWORD
有用的选项
    -i 不区分大小写的搜索
    -n  N 只列举前N个匹配项目
    -r  使用正则表达式
示例:
    搜索名称或路径中带有“conf”的文件
        locate  conf
    使用Regex来搜索以“.conf”结尾的文件
        locate  -r  ‘\.conf$’

2、find: 实时查找

    工作特点: 
    ? 查找速度略慢 
    ? 精确查找 
    ? 实时查找
    ? 可能只搜索用户具备读取和执行权限的目
语法:
    find [OPTION]... [查找路径] [查找条件] [处理动作] 
    查找路径:指定具体目标路径;默认为当前目录 
    查找条件:指定的查找标准,可以文件名、大小、类型、 权限等标准进行;默认为找出指定路径下的所有文件
    处理动作:对符合条件的文件做操作,默认输出至屏幕

查找条件:

 指搜索层级
    -maxdepth  level 最大搜索目录深度,指定目录为第1级
    -mindepth  level 最小搜索目录深度
    如果指定搜索哪一级目录则,最大为此目录最小也为此目录
例如:指定搜索/etc目录下为5级目录的目录和文件
    Find /etc –maxdepth 5  –mindepth 5

根据文件名和inode查找:

-name "文件名称":支持使用glob(文件通配符)
    find /etc/ -name "*pas?wd*"
    *, ?, [], [^]
-iname "文件名称":不区分字母大小写
    find /etc/ -iname *pas?wd*   
-inum n  按inode号查找
    find -inum 69  //查看inode号为69的文件
-samefile name  相同inode号的文件
    find -samefile a123     //查找硬链接
-links n   链接数为n的文件
    find -links 2  //查看链接数为2的文件
-regex "PATTERN":以PATTERN(正则表达式)匹配整个文件路径字符串,而不仅仅是文件名称
find /etc/ -regextype posix-egrep -regex  ".*/pa[sa]{2}wd"  //支持拓展表达式

根据属主、属组查找:

    -user  USERNAME: //查找属主为指定用户(UID)的文件
例:find –user lin  //查看用户名为lin的文件
    -group  GRPNAME: //查找属组为指定组(GID)的文件
    -uid  UserID: //查找属主为指定的UID号的文件
例:find –user 1003  //查看UID为1003的文件
    -gid  GroupID: //查找属组为指定的GID号的文件
    -nouser: //查找没有属主的文件
        例:find –nuuser //查找当前目录下没有属主的文件
    -nogroup: //查找没有属组的文件

根据文件类型查找:

-type TYPE:      //TYPE选项
find /dev/ -type l  //查看dev下链接文件
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件

组合条件查找

组合条件: 
 与:-a(and)  或:-o(or)  非:-not, !
德·摩根定律: 
    (非 A) 或 (非 B) = 非(A 且 B) 
    (非 A) 且 (非 B) = 非(A 或 B) 
示例: 、
    !A -a !B = !(A -o B) 
    !A -o !B = !(A -a B)

示例:
find -name snow.png //? 搜索名为snow.png的文件
find -iname snow.png //? 不分大小写地搜索名为snow.png、Snow.png、 SNOW.PNG等等的文件
find / -name “.txt” //搜索根目录下以.txt结尾的文件
find /var –name “
log” //搜索/var目录下文件名带log的文件
find -user joe -group joe //搜索被用户joe 以及组群joe所拥有的文件
find -user joe -not -group joe //搜索所属人是joe,但是所属组不是joe的文件
find -user joe -o -user jane //搜索所属人是joe,或者是jane的文件。
find -not ( -user joe -o -user jane ) //搜索不属于是joe且不属于jane的文件。
find / -user joe -o -uid 500 //搜索根目录所属人是joe或所属组为500的文件。
示例:
1、找出/tmp目录下,属主不是root,且文件名不以f开头的文件
find /tmp ( -not -user root -a -not -name ‘f
‘ ) –ls
find /tmp -not ( -user root -o -name ‘f*‘ ) –ls
查找并显示文件的方法
  查找到某个文件是我们的目的,我们更想知道查找到的文件的详细信息和属性,如果我们采取现查找文件,在使用LS命令来查看文件信息是相当繁琐的,现在我们也可以把这两个命令结合起来使用
[[email protected] bin]# find -user root -ls
137744 4 drwxr-xr-x 2 root root 4096 Jan 26 20:05 .
137793 4 -rwxrwxrwx 1 root root 135 Jan 26 10:40 ./per.sh

排除目录

示例:
1、查找/etc/下,除/etc/sane.d目录的其它所有.conf后 缀的文根据文件大小来查找:
find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf”
2、查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的其他所有.conf后缀的文件
find /etc \(–path ‘/etc/sane.d’ –o –path ’/etc/fonts’ \) -a prune –o name “*.conf”

根据文件大小查找

-size [+|-]#UNIT
    常用单位:k, M, G,c(byte)
#UNIT: (#-1, #]
    如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
    如:-6k 表示[0,5k]
+#UNIT:(#,∞)
    如:+6k 表示(6k,∞)

根据时间戳查找:

以“天”为单位;
  -atime [+|-]#,  
    #: [#,#+1)
    +#: [#+1,∞]
    -#: [0,#)
    -mtime
    -ctime
以“分钟”为单位:
    -amin
    -mmin
    -cmin

示例:
find /etc/ -mtime -1 //查看etc目录下一分钟以内的操作
find / -amin -10 # 查找在系统中最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group cat # 查找在系统中属于 groupcat的文件
find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件
find / -nouser #查找在系统中属于作废用户的文件
find / -user fred #查找在系统中属于FRED这个用户的文件

下面的列表就是对find命令所可以指定文件的特征进行查找的部分条件。在这里并没有列举所有的查找条件,参考有关Linux有关书籍可以知道所有find命令的查找函数。

  -amin n 查找系统中最后N分钟访问的文件
  -atime n 查找系统中最后n24小时访问的文件
-mmin n 查找系统中最后N分修改过的文件
  -mtime n 查找系统中最后n
24小时修改过的文件
  -cmin n 查找系统中最后N分钟被改变状态的文件
  -ctime n 查找系统中最后n*24小时被改变状态的文件
  -empty 查找系统中空白的文件,或空白的文件目录,或目录中没有子目录的文件夹
  -false 查找系统中总是错误的文件
  -fstype type 查找系统中存在于指定文件系统的文件,例如:ext2 .
  -gid n 查找系统中文件数字组 ID 为 n的文件
  -group gname 查找系统中文件属于gnam文件组,并且指定组和ID的文件

Find命令的控制选项说明:
  Find命令也提供给用户一些特有的选项来控制查找操作。下表就是我们总结出的最基本,最常用的find命令的控制选项及其用法。

   选项 用途描述
  -daystart .测试系统从今天开始24小时以内的文件,用法类似-amin
  -depth 使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容
  -follow 遵循通配符链接方式查找; 另外,也可忽略通配符链接方式查询
  -help 显示命令摘要
  -maxdepth levels 在某个层次的目录中按照递减方法查找
  -mount 不在文件系统目录中查找, 用法类似 -xdev.
  -noleaf 禁止在非UNUX文件系统,MS-DOS系统,CD-ROM文件系统中进行最优化查找
  -version 打印版本数字

下面的表格就是一些常用的查找文件并显示文件信息的参数和使用方法

    选项 用途描述
  -exec command; 查找并执行命令
  -fprint file 打印文件完整文件名
  -fprint0 file 打印文件完整文件名包括空的文件
  -fprintf file format 打印文件格式
  -ok command; 给用户命令执行操作,根据用户的Y 确认输入执行
  -printf format 打印文件格式
  -ls 打印同种文件格式的文件.

根据权限查找:

     -perm [/|-]MODE
    MODE: 精确权限匹配
        /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘汰,centos6及其之前的系统/ +均可用。
    -MODE:每一类对象都必须同时拥有指定权限,与关系
    0 表示不关注
    find?-perm?755 会匹配权限模式恰好是755的文件
    只要当任意人有写权限时,find?-perm?+222就会匹配   当权限描述为组合权限时,即5,6,7时,各权限间为或的关系
    只有当每个人都有写权限时,find?-perm?-222才会匹配  当权限描述为组合权限时, 即5,6,7时,各权限间为且的关系
    只有当其它人(other)有写权限时,find?-perm?-002才会匹配

 处理动作
    -print:默认的处理动作,显示至屏幕
    -ls:类似于对查找到的文件执行“ls -l”命令
    -delete:删除查找到的文件
    find -size +6k -delete
    -fls file:查找到的文所有件的长格式信息保存至指定文件中
    -ok -exec   ok交互式,exec直接运行
    find -name "*.tmp" -ok rm -f {} \;
    find -type f -name "*.sh" -exec chmod a+x {} \;
    find -name "*.conf" -exec cp -i {} {}.bak \;

-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个 文件执行命令之前,都会交互式要求 用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由 COMMAND指定的命令 
{}: 用于引用查找到的文件名称自身 
find传递查找到的文件至后面指定的命令时,查找到所有符合 条件的文件一次性传递给后面的命令

参数替换xargs

** 由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令 **
xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为 arguments 
 注意:文件名或者是其他意义的名词内含有空格符的情况 
 有些命令不能接受过多参数,命令执行可能会失败,xargs可 以解决 
  示例: ls f* |xargs rm 
  find /sbin -perm +700 |ls -l       这个命令是错误的 
  find /sbin -perm +7000 | xargs ls –l 
  ** find和xargs格式:find | xargs COMMAND **

find示例
find -name “.conf” -exec cp {} {}.orig \;
? 备份配置文件,添加.orig这个扩展名
find /tmp -ctime +3 -user joe -ok rm {} \;
? 提示删除存在时间超过3天以上的joe的临时文件
find ~ -perm -002 -exec chmod o-w {} \;
? 在你的主目录中寻找可被其它用户写入的文件
find /data –type f -perm 644 -name “
.sh” –exec chmod 755 {} \;
find /home –type d -ls

以上是关于文件查找的主要内容,如果未能解决你的问题,请参考以下文章

查找上一个活动片段

如何使用导航架构组件查找子片段

如何创建片段以重复变量编号中的代码行

Android:从片段调用活动

以下代码片段的时间复杂度是多少?

在片段中,如何查找活动布局中定义的视图?