find详解

一、简介

find是用来在文件系统上查找复合条件的文件

find命令有非常强大的灵活性,可以指定丰富的搜索条件(如文件权限属主属组文件类型日期大小等)来定位系统中的文件和目录,同时还支持对对搜索的结果进行命令操作

find命令格式:

find [paths(查找路径)] [expression(查找条件)] [actions(处理动作)] 2>/dev/null

find命令接受一个或多个路径(paths)作为搜索范围,并在该路径下递归搜索。

即检索完指定目录后,还会对该目录下的子目录进行检索,直至检索完所有层级下文件

默认情况下(不带任何搜索条件),find命令会返回指定目录下的 所有文件 ,所以通常通过特定的 expression 对结果进行筛选

find默认命令的 actionprint ,将所有检索结果打印至标准输出

可以通过自定义 action ,让 find 命令对搜索到的结果执行特定的操作

由于权限等问题,可能查找报错,建议最后将报错重定向 2>/dev/null ,避免显示大量无用信息

二、搜索条件

1、根据文件名查找

参数

-name "文件名称": 区分大小写,支持使用glob 通配符 * ? []  [^]
            
-iname "文件名称":不区分字母大小写
                    
-path "/path/name" : 匹配某个文件或目录的完整路径,而不仅仅是匹配文件名

示例:

# 查找 /usr 目录下所有文件名以 .txt 结尾的文件
find /usr -name '*.txt'

#查找 /usr 目录下所有文件名刚好为 4 个字符的文件
find /usr -name '????'

#查找 /usr 下所有文件名以 .txt 结尾的文件或目录,且该文件的父目录必须是 src
find /usr -path '*/src/*.txt'	

2、根据文件类型查找
-type 类型
    f:普通文件
    d:目录文件
    l:符号链接文件
    s:套接字文件
    b:块设备文件
    c:字符设备文件
    p:管道文件
    
# 检索 /usr 下所有文件名以 python 开头的目录
find /usr -type d -name 'python*'
3、根据文件大小来查找
-size [+|-] #Unit

#Unit常用单位:K M G
#+ 或 - 符号表示大于或小于当前条件

#Unit : (#-1,#]
-#Unit : [0,#-1] : 小于指定大小文件
+#Unix : (#,) : 大于指定大小文件

# 查找大于100M的文件
find / -size +100M 
4、根据时间戳查找
Linux 系统中,与文件相关联的时间参数有以下三种:

修改时间(Modification time):最后一次文件内容有过更改的时间点
访问时间(Access time):最后一次文件有被读取过的时间点
变更时间(Change time):最后一次文件有被变更过的时间点(如内容被修改,或权限等 metadata 被修改)

与此对应的是 find 命令中的 -mtime,-atime 和 -ctime 三个选项

以"天"为单位
    -atime [+|-]#
        #: [#,#+1) : 这里的#表示#天之前的“一天之内”被访问过的文件
        +#: [#+1,OO]: 列出在#天之前(不包含#天本身)被访问过的文件
        -#: [0,#) : 列出在#天之内(包含#天本身)被访问过的文件
        
    -mtime [+|-]
    -ctime [+|-]

以"分钟"为单位
    -amin
    -mmin
    -cmin
    
# 查找两天之前的一天内被访问的文件(距离现在的前48 ~ 72 小时之间)
find -atime  2 

# 查找距离此时2天内被访问的文件(距离现在前48小时之内)
find -atime -2 

# 两天之前,不包括两天之前的一天的被访问的文件(离此时72小时之前)
find -atime +2 
5、根据文件的所属权
-user username :查找属主为指定用户的文件
-group groupname :查找指定属组的文件

-uid userid:查找属主为指定uid号的文件
-gid groupid 查找属组为指定gid号的文件

-nouser :查找没有属主的文件
-nogroup : 查找没有属组的文件

# 查找/var目录下属主为root,且属组为mail的所有文件或目录、
find /var -user root -a -group mail
6、根据权限查找
-perm [+|-] Mode
Mode : 精确权限匹配            
+Mode :任何一类(u,g,o)对象的权限中只要有一位匹配即可
-Mode :完全包含此mode时才可以匹配,每一类对象都必须同时拥有为其指定的权限标准


# 查找在/tmp目录下权限是755的文件
find  /tmp  -perm  755           

# 表示必须所有类别用户都满足有写权限
find  /tmp  -perm  -222        

# 表示只要有一类用户(属主,属组,其他)的匹配写权限就行
find  /tmp  -perm  +222

7、逻辑组合
-a
或 -o
非 -not

!A -a !B = !(A -o B)
!A -o !B = !(A -a B)


# 查找/etc目录下最近一周内其内容修改过,且属主不为root,也不是hadoop的文件或目录
 find /etc -mtime -7 -not \( -user root -o -user hadoop \)
 
 # 查找5分钟内或50分钟前被修改 ,并且 类型为文件的 所有文件
 find / '(' -mmin -5 -o -mtime +50 ')' -a -type f

三、处理动作

1、常用处理动作
-print :默认的处理动作,显示至屏幕

-ls :类似于对查找到的文件执行 "ls -l"命令

-delete :删除查找到的文件

-fls /path/to/somefile :查找到的所有文件的长格式信息保存至指定文件中

# 其中的大括号{}作为检索到的文件的 占位符 ,用于引用查找到的文件名称自身
# 而分号( ;)作为命令结束的标志, 需要转义 , 也可以用 + 号表示
# -exec command {} \;  等同于 -exec command {} +


-ok command {} \; 
	对查找到的每个文件执行由command指定的命令
    对于每个文件执行命令之前,都会交互式要求用户确认
    
-exec command {} \; 
	对查找到的每个文件执行由command指定的命令


# 浏览所有 1G 以上大小的文件的详细信息
find / -type file -size +1G -ls 

# 删除 home 目录下所有的空目录:
find ~ -type d -empty -delete

# 删除/var下空文件
find /var -size 0 -type f -exec rm -rf {} \;


2、删除大量文件
# 删除海量文件,rm会很慢甚至卡死
# 一般用 find 或 rsync 来删除大量文件
# rsync 速度快于 find

# 可以用 time 测试速度
#time find ./ -type f -delete     
find ./ -type f -delete  

#  test  time find ./ -type f -exec rm {} \;
find ./ -type f -exec rm {} \;  

# 使用rsync进行删除
# 首先建立空文件夹blanktest
# time rsync -a --delete blanktest/ test/
rsync -a --delete blanktest/ test/ 
3、find 结合 xargs

注意:

find 传递查找到文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的指令
有些命令不能接受过多参数,此时命令执行可能会失败,另一种方式可规避此问题

find | xargs command

xargs 介绍

xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。

xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。

在指定路径下查找含有指定字符串的文件

# 将find查找的所有文件 作为参数传递给 grep进行过滤
find /path | xargs grep -ri "string" 

四、常用示例

# 查找大于200M的文件,并显示具体大小
find / -type f -size +200M 2>/dev/null | xargs du -sh

# 查找大于200M的文件,并显示详细信息
find / -type f -size +200M 2>/dev/null | xargs ls -l

# 查找系统中 最大的 10 个文件
find / -type f -exec du -sh {} + 2>/dev/null | sort -rh | head -n 10

# 查找 /etc 下 文件内包含 "password" 的文件
find /etc | xargs grep -ri "password" 

# 遍历查找所有目录下的 Inode数量
for i in /*; do echo $i; find $i  2>/dev/null | wc -l; done

# 删除大与100M,时间在7天前的文件
find /test -size +100M -mtime +7 -delete
  • 31
    点赞
  • 215
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
`find` 命令是在 Linux 系统中查找文件和目录的常用工具之一,它可以递归查找指定目录下符合条件的文件和目录。下面是 `find` 命令的详细用法说明: ```bash find [path] [expression] ``` 其中,`path` 是指查找的目录路径,可以是绝对路径或相对路径。如果未指定 `path`,则默认为当前目录。 `expression` 是一个或多个由操作符和参数组成的表达式,用于指定查找条件和操作。下面是一些常用的操作符和参数: - `-name pattern`:查找文件名匹配 `pattern` 的文件,例如 `find /path -name "*.txt"` 将查找 `/path` 目录及其子目录下所有扩展名为 `.txt` 的文件。 - `-type type`:查找指定类型的文件,`type` 可以是以下之一:`f` 表示普通文件,`d` 表示目录,`l` 表示符号链接,`c` 表示字符设备,`b` 表示块设备,`p` 表示管道,`s` 表示套接字。 - `-mtime n`:查找最后修改时间在 `n` 天前的文件,例如 `find /path -mtime +7` 将查找 `/path` 目录及其子目录下最后修改时间在 7 天前的文件。 - `-size n`:查找文件大小为 `n` 块的文件,例如 `find /path -size +100M` 将查找 `/path` 目录及其子目录下文件大小大于 100 MB 的文件。 - `-exec command {} \;`:对查找到的文件执行指定命令,例如 `find /path -name "*.txt" -exec cat {} \;` 将查找 `/path` 目录及其子目录下所有扩展名为 `.txt` 的文件,并输出文件内容。 这些参数可以组合使用,例如 `find /path -type f -name "*.txt" -mtime +7 -exec rm {} \;` 将查找 `/path` 目录及其子目录下最后修改时间在 7 天前的扩展名为 `.txt` 的文件,并删除它们。 除了这些参数外,`find` 命令还支持一些高级用法,例如 `-maxdepth`、`-mindepth`、`-prune`、`-print` 等,您可以通过 `man find` 命令查看更多用法和示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值