Linux命令4-find、locate
- find
- locate
find-查找文件
命令简介
find命令用于在指定目录中查找文件,命令格式为:
1 | find [指定查找目录] [查找规则] [查找后执行的动作] |
-
查找路径:指定具体目标路径,默认为当前目录
-
查找条件:指定的查找标准,可以是文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
-
执行动作:对符合条件的文件做操作,默认输出至屏幕
1 | find pathname [选项] [-print] [-exec -ok command] {} \; |
主要的参数是:
参数 | 说明 |
---|---|
pathname | 所查找的文件路径;用点.来表示当前目录,用/来表示系统根目录 |
将匹配的文件输出到标准输出 | |
-exec | find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为command {} ;注意{} 和\; 之间的空格 |
-ok | 和-exec类似,只是在操作之前会询问用户 |
主要的选项说明:
选项 | 说明 |
---|---|
-name | -name filename:按照名字来查找 |
-perm | 按照执行权限来查找 |
-user | -user username:按照文件属性来查找 |
-group groupname | -group groupname:按照所属组来查找 |
-mtime -n、+n | -n、+n:按照文件更改时间,-n表示n天之内,+n指的是n天以前 |
-atime | 按照访问时间来查 |
-ctime | 按照创建时间来查;-n、+n:-n指的是n天之内,+n指的是n天以前 |
-newer f1 !f2 | 查找更改时间比f1新,但是比f2旧的文件 |
-size n[c] | 查找长度是n块(n个字节)的文件 |
-type b/d/c/p/l/f | 查找块设备、目录、字符设备、管道、符号链接、普通文件 |
普通查找条件
1 | find . # 列出当前目录及子目录下的全部文件及文件夹 |
根据文件路径查找
1 | find /root -path "*local*" |
根据文件名查找
1 | find . -name "*.md" # 查找以md结尾的文件 |
注意通配符的使用:
1 | find . -name "hello?" # 匹配任意单个字符 |
根据深度搜索
1 | find . -maxdepth 3 -type f # 向下最大搜索限制为3 |
根据uid或gid搜索
1 | find . -uid 700 # 查找uid是700的文件 |
根据时间查找
Linux文件系统文件中每个文件都有3种时间戳:
- 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
- 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
- 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
使用stat命令来查看一个文件的时间信息:
1 | stat /etc/passwd |
通过时间查找文件的例子:
1 | find . -type f -atime -7 # 搜索最近7天被访问过的文件 |
根据大小查找
Linux系统中文件大小单元:
符号 | 大小 |
---|---|
b | 块,512字节 |
c | 字节 |
w | 字(2个字节) |
k | 千字节 |
M | 兆字节 |
G | 吉字节 |
1 | find . -type f -size +10k # type指定类型为f(文件),大于10k |
根据逻辑判断条件查找
根据3种逻辑判断条件来进行查找:
- -a:连接两个不同的条件,同时满足条件
- -o:连接两个不同的条件,满足其中一个
- -not:对条件取反
1 | 与:-a |
1 | find . -name "*.md" -a -user root # and |
根据用户及用户权限查找
Linux中文件具有3种权限:读、写、可执行
权限 | 对文件的影响 | 对目录的影响 | 对应大小 |
---|---|---|---|
r(读取) | 可读取文件内容 | 可列出目录内容 | 4 |
w(写入) | 可修改文件内容 | 可在目录中创建删除内容 | 2 |
x(执行) | 可作为命令执行 | 可访问目录内容 | 1 |
目录必须拥有 x 权限,否则无法查看其内容
Linux中的权限分配给3种用户:user、group、other
- U:User
- G:Group
- O:Other
每个文件的权限基于UGO进行设置;权限三位一组(rwx),同时需授权给三种角色(UGO);
每个文件拥有一个所属用户和所属组,对应UGO,不属于该文件所属用户或所属组使用O来表示。
1 | drwxr-xr-x 5 peter staff 160 3 5 2020 good-good-study |
解释上面目录属性:
- d:表示目录,同一位置如果为
-
则表示为普通文件 - rwxr-xr-x:表示分配给3种用户的权限,以此是ugo;则对应为:user的权限rwx(4+2+1=7),group的权限r-x(4+0+1=5),other的权限r-x(4+0+1=5)
- 5:表示文件夹的链接数量,可以理解为目录子目录的数量
- peter:表示用户名;staff:表示peter所属的组名;其他人角色默认不显示
- 160:表示该文件夹占据的字节数
- 3 5 2020:文件创建时间
- good-good_study:目录名或者文件名
理解了上面Linux中用户(组)及用户权限的问题,可以查找相关的文件:
1 | find . -type f -perm 777 # 查找权限为777 的文件 |
符号{}的使用
ind命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } ;,注意{ }和\;之间的空格。
- 先通过
find
命令查找出结果 - 再通过
-exec
和{} \;
进行结果的输出
1 | find . -type f -exec ls -l {} \; # 前面是找出文件,后面是输出文件到终端() |
总结:
-exec
:直接执行动作,不会询问-ok
:执行动作之前先询问
locate
命令简介
locate 可以很快速的搜寻档案系统内是否有指定的档案。locate 因为是只去检索索引数据库,所以在比 find 全盘检索要快很多。
locate是透过update程序将硬盘中的所有档案和目录资料先建立一个索引数据库,在 执行loacte时直接找该索引,查询速度会较快
locate命令是查不到最近的数据,如果想查询需要先更新数据库:
1 | updatedb # 更新数据库 |
命令格式
locate命令的一般格式为:
1 | locate [option] [pattern] |
命令选项
选项 | 说明 |
---|---|
-A, --all |
只显示匹配所有模式的条目 |
-b, --basename |
只匹配路径名的基本名称 |
-c, --count |
只显示找到的条目的数目 |
-d, --database DBPATH |
使用 DBPATH,而非默认数据(即:/var/lib/mlocate/mlocate.db) |
-e, --existing |
只显示当前存在的文件条目 |
-L, --follow |
当文件存在时跟随蔓延的符号链接(默认) |
-h, --help |
显示帮助信息 |
-i, --ignore-case |
忽略大小写区别 |
-l, --limit, -n LIMIT |
限制为 LIMIT项目的输出(或 计数) |
-m, --mmap |
被忽略,用于向后兼容 |
-P, --nofollow, -H |
当检查文件时不跟随蔓延的符号链接 |
-0, --null |
输出时以 NUL 分隔项目 |
-S, --statistics |
不搜索项目,显示有关每个已用数据库的统计信息 |
-q, --quiet |
不报告关于读取数据库的错误消息 |
-r, --regexp REGEXP |
搜索基本正则表达式 REGEXP 而不是模式 |
--regex |
模式是扩展正则表达式 |
-s, --stdio |
被忽略,用于向后兼容 |
-V, --version |
显示版本信息 |
-w, --wholename |
匹配完整路径名(默认) |
使用案例
1 | locate /home/hello # 指定目录下查找hello开头的文件 |