Fork me on GitHub

Linux命令4-find、locate

Linux命令4-find、locate

  • find
  • locate

find-查找文件

命令简介

find命令用于在指定目录中查找文件,命令格式为:

1
find [指定查找目录] [查找规则] [查找后执行的动作]
  1. 查找路径:指定具体目标路径,默认为当前目录

  2. 查找条件:指定的查找标准,可以是文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件

  3. 执行动作:对符合条件的文件做操作,默认输出至屏幕

1
find pathname [选项] [-print] [-exec -ok command] {} \;

主要的参数是:

参数 说明
pathname 所查找的文件路径;用点.来表示当前目录,用/来表示系统根目录
-print 将匹配的文件输出到标准输出
-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
2
3
4
5
6
7
8
9
10
11
find .  # 列出当前目录及子目录下的全部文件及文件夹
find /root -name "*.txt" # 查找root目录下以txt结尾的文件
find /root -iname "*.txt" # 同上,但是忽略大小写
find . -name dog* -o -name cat* # 当前目录下查找以dog或者cat开始的文件
# find . \( -name dog* -o -name cat* \)
find /home ! -name "*.md" # 找出home目录下不是以md结尾的文件
find . -type [fldcbs] # [类型参数: f普通文件 l符号链接 d目录 c字符设备 b块设备 s套接字]
find -name hello* # 查找hello开头的文件
find -name hello* fprint file # 在当前目录下查找hello开头的文件,并输出到file文件中
find . -type f -exec ls -l {} \; # 查找当前目录下的所有普通文件
find . -type f -name ".md" -delete # 找出md结尾的全部文件,并进行删除

根据文件路径查找

1
find /root -path "*local*"

根据文件名查找

1
2
find . -name "*.md"    # 查找以md结尾的文件
find . -iname "*.md" # 不区分大小写

注意通配符的使用:

1
2
3
find . -name "hello?"  # 匹配任意单个字符
find . -name "[ab].sh" # 匹配括号里面的一个字符
find . -name "*hello*" # 匹配任意一个或多个字符

根据深度搜索

1
2
find . -maxdepth 3 -type f # 向下最大搜索限制为3
find . -mindepth 2 -type f # 搜索距离当前目录至少两个目录的所有文件

根据uid或gid搜索

1
2
find . -uid 700   # 查找uid是700的文件
find . gid 1000 # 查找gid是1000的文件

根据时间查找

Linux文件系统文件中每个文件都有3种时间戳:

  • 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
  • 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
  • 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。

使用stat命令来查看一个文件的时间信息:

1
stat /etc/passwd

通过时间查找文件的例子:

1
2
3
4
5
find . -type f -atime -7  # 搜索最近7天被访问过的文件
find . -type f -atime 7 # 搜索恰好在7天前被访问的所有文件
find . -type f -atime +7 # 搜索超过7天被访问的文件
find . -type f -amin +10 # 超过10分钟访问的文件
find . -type f -newer hello.txt # 找出比hello.txt修改时间更长的所有文件

根据大小查找

Linux系统中文件大小单元:

符号 大小
b 块,512字节
c 字节
w 字(2个字节)
k 千字节
M 兆字节
G 吉字节
1
2
3
4
find . -type f -size +10k  # type指定类型为f(文件),大于10k
find . -type f -size 10k # type指定类型为f(文件),刚好为10k
find . -type f -size -10k # type指定类型为f(文件),小于10k
find . -empty # 列出长度为0的文件

根据逻辑判断条件查找

根据3种逻辑判断条件来进行查找:

  • -a:连接两个不同的条件,同时满足条件
  • -o:连接两个不同的条件,满足其中一个
  • -not:对条件取反
1
2
3
与:-a
或:-o
非:-not, !
1
2
find . -name "*.md" -a -user root   # and
find /tmp -not -user root # tmp目录下,用户不是root

根据用户及用户权限查找

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
2
3
4
find . -type f -perm 777  # 查找权限为777 的文件
find . -type f -name ".md" ! -perm 644 # 查找当前目录下全部不是644的md文件
find . -type f -user peter # 查找peter拥有的全部文件
find . -type f -group staff # 查找用户组staff的全部文件

符号{}的使用

ind命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } ;,注意{ }和\;之间的空格。

  • 先通过find命令查找出结果
  • 再通过-exec{} \;进行结果的输出
1
2
3
find . -type f -exec ls -l {} \;   # 前面是找出文件,后面是输出文件到终端()
find ./ -mtime -1 -type f -exec ls -l {} \; # 查找当前修改过的文件(不会询问)
find ./ -mtime -1 -type f -ok ls -l {} \; # ok会询问是否输出

总结:

  • -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
2
3
4
5
6
$ locate /home/hello  # 指定目录下查找hello开头的文件
$ locate hello # 查询hello开头的文件
$ locate -n 10 python # 限制输出10条和python相关的条目
$ locate -i -n 5 passwd # 不区分大小写
$ locate -r ^/var/lib/rpm # 使用正则表达式:^表示开始的符号
$ locate -r zip$ # 以zip结尾的文件

本文标题:Linux命令4-find、locate

发布时间:2021年02月07日 - 12:02

原始链接:http://www.renpeter.cn/2021/02/07/Linux%E5%91%BD%E4%BB%A4-4-find%E3%80%81locate.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea