find 用法整理

  • 2016-11-21
  • 857
  • 2

  find 是shell脚本或日常使用中最常用的命令之一,其参数也比较多,每次用的时候总是要去查参数,还是自己整理一下参数和用法,以备不时之需。主要整理的资源来自《Linux Shell脚本攻略》,并搜集了其他一些博主的经验。

1. 基于文件名、路径、正则表达式
find -name  根据文件名查找;
find -path  如果要匹配路径和目录名;
find -regex  基于正则表达式,文件名和路径都能匹配,能完成更复杂的搜索。

  示例中,-name 与 -regex 都是找到当前目录,以 .sh 结尾的文件,如果第三项改为find ./ -regex ".*\.sh"(不加$结尾符号),那么还可以匹配 test.sh 这样的目录。

 
2. 不区分大小写(用法同上)
-iname
-ipath
-iregex

 
3. 基于目录深度
find -maxdepth 2  从当前目录,最多搜索两级(包括当前目录,也就是最多搜索下一层子目录)
find -mindepth 2  则代表至少两级之后,才开始搜索(同样包括当前目录,示例中 -print 是 find 命令的默认动作)

 
4. 根据文件类型
-type d  目录
-type f  文件
-type l  符号链接
-type c  字符设备
-type b  块设备
-type s  套接字
-type p  FIFO

 
5. 根据文件时间
5.1 time 时间属性
示例1,找到当前路径超过20天的tar.gz文件;

-atime  最后访问时间,vim、cat 都会更新一个文件的atime
-mtime  内容修改时间,比如文本文件被修改,这时mtime、atime都会更新
-ctime  元数据修改时间,比如权限被修改,仅更新ctime
(PS:stat 命令可以查看这三个时间; ls 命令查看的是mtime; touch 命令会将这三个时间都更新,并不只是atime!)

-amin  -mmin  -cmin  (time的单位是“天”,min的单位是“分钟”)

-mtime +20  修改时间超过20天
-mtime -20  修改时间在20天以内
-mtime 20  修改时间刚好为20天前

5.2 -newer 基于修改时间对比
示例2,前者是找到当前目录比 test.sh 修改时间更晚的文件;后者则是找到修改时间更早的文件,下方还有 ! 感叹号的用法。

 
6. 反向匹配 !
示例1,找到当前目录下,所有不是.sh后缀的文件

示例2,注意 ! 的位置在 -type 之后,此处匹配的“权限不是777的文件”

 
7. 根据权限,所有者,所属组

 
8. 跳过特定的目录 / 9. 多个条件查找

  全盘搜索时,偶尔会遇到 /proc 内存目录弹出很多权限提示,如果要避免它的干扰,可以使用 -prune 排除掉匹配的内容。

  示例,在根下除了 /proc 之外的目录,查找 .sh 后缀的文件(大部分时候,即使多个条件也不需要使用 -o 参数,但使用 -prune 时,就要用到它)

 
10. 删除

  这里一共列举了三种删除的写法,意义是相同的,需注意第三项带有 xargs 的用法。有时候,我们要删除的文件过多时,可能bash会完全卡住,因此需要利用 xargs 把列表输出给删除命令。

  而find的默认动作是 -print,会以 \n 和空格作为分隔符。假如正好有个文件名带有空格 “file 2016”,在使用find ./ -name "*2016*" -print | xargs rm -f这条命令的情况下,就会分别删除“file”和“2016”两个文件!

  因此为了避免误删,可参考以下-print0 | xargs -0的形式,手工指定 \0 分隔符。

 
11. find 执行命令
  -exec 在find后面执行其他组合命令,是一个特别强大的特性,{}大括号代表被find匹配到的内容,\;结束命令的执行。如要修改文件目录权限,示例如下:

 
12. 基于文件大小
-size +2k  大于2k;
-size -2k  小于2k;
-size 2k  等于2k;

 
13. 空文件/目录,以及隐藏文件

 
14. 结合grep查找文件内容
在已找到的文件中,利用grep搜索文件内容。由于find只返回了文件名的列表,因此还需要借助xargs来传递给grep,示例如下:

 
  这里仅仅把很常用的find参数整理出来了,其实find还有很多参数,比如 -printf 格式化输出、-context 根据安全上下文等等,这些特殊场景下还需要仔细查阅man文档。
 


参考文档:
《Linux Shell脚本攻略》(第二版)
GTW – Unix/Linux 的 find 指令使用教學、技巧與範例整理

评论

  • 菜鸟运维回复

    漏了一个用法,查找包含内容
    find ./ -name ‘*.conf’ | xargs grep “www.cnyunwei.cc”

发表评论