find命令,查找文件和目录

find查找命令是Linux系统中最重要和最常用的命令之一。查找用于根据与参数匹配的文件指定的条件来搜索和查找文件和目录列表的命令。查找可以在各种条件下使用,您可以通过权限,用户,组,文件类型,日期,大小等可能的条件查找文件。

语法:

find pathname -option [-print ] [ -exec | -ok command ] {} ;

find命令的参数;

参数 描述
pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print find命令将匹配的文件输出到标准输出。
-exec find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为command { } ;,注意{ }和\;之间的空格。
-ok 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

第一部分:查找名称查找文件的基本查找命令

参数 描述
-name filename 查找名为filename的文件。
-iname filename 与-name相同,查找名为filename的文件,但忽略大小写,即不区分大小写。
-type b/d/c/p/l/f 按照文件类型查找,查是块设备、目录、字符设备、管道、符号链接、普通文件。 块设备:随机读取,例如硬盘 字符设备:顺序读取,例如键盘、鼠标

-type 查找某一类型的文件,诸如:

b -> 块设备文件。

d -> 目录。

c -> 字符设备文件。

p -> 管道文件。

l -> 符号链接文件。

f -> 普通文件。

s -> socket文件

  1. 使用当前目录中的名称查找文件
find a.txt
  1. 在指定目录下查找文件
find /root/ -name a.txt
  1. 使用名称和忽略大小写查找文件
find /root/ -iname a.txt
  1. 使用名称查找目录
find / -type d -name temp
  1. 使用名称查找PHP文件
find / -type f -name temp.hph
  1. 查找目录中的所有PHP文件
find / -type f -name "*.hph"
  1. 查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,没有选项-print时文件列表前一行不会显示目录名称

说明:这里要注意{}的使用:替代查找到的文件

find /root/ -type d -print -exec ls {} \;
find /root/ -type d -exec ls {} \;

alt

  1. 查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,执行命令前需要确认)
find /root/ -type d -ok ls {} \;

第二部分:根据他们的权限查找文件

参数 描述
-perm 按执行权限来查找
-empty 查找长度为零(即空文件)的文件 r 4 w 2 x 1
  1. 查找权限为777的所有文件
find -type f -perm 0777 -print
  1. 查找没有777权限的文件 说明: !表示否定,即取反
find -type f ! -perm 0777
  1. 查找权限设置为644的所有SGID位文件。
find / -perm 2644
  1. 查找权限为551的所有Sticky Bit设置文件。
find / -perm 1551
  1. 查找所有可执行文件。
find / -perm /a=r
  1. 找到777个权限和Chmod到644的文件
find . -type f -perm 777 -print -exec chmod 644 {} \;
  1. 找到一个名为test.c的文件并将其删除
find -type f -name test.c -exec rm -f {} ;
  1. 查找和删除多个文件,如.mp3或.txt
find -type f -name “.txt" -exec rm -f {} ;
find -type f -name ".mp3” -exec rm -f {} ;
  1. 在特定路径下查找所有空文件。
find /tmp -type f -empty
  1. 在特定路径下查找所有空目录
find /tmp -type d -empty
  1. 查找空文件或空目录
find ./ -empty
  1. 查找空文件并删除
find ./ -empty -name test.a -print -delete

第三部分:基于所有者和组的搜索文件

参数 描述
-user username 按文件属主来查找
-group groupname 按组来查找
-nogroup 查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser 查无有效属主的文件,即文件的属主在/etc/passwd中不存(孤儿文件 没有所有者的文件)
  1. 查找所有者root的、名为test.c的文件。
find / -user root -name test.c
  1. 查找/home目录下属于Group Developer的所有文件。
find / -group developer
  1. 查找无效属组的所有文件
find / -nogroup
  1. 查找无效属主的所有文件
find / -nouser

第四部分:根据日期和时间查找文件和目录

参数 描述
-mtime -n +n 按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n 按文件访问时间来查,-n指n天以内,+n指n天以前
-ctime -n +n 按文件创建时间来查找文件,-n指n天以内,+n指n天以前

注:我们可以使用stat命令来查看一个文件的时间信息。

1.在/root下查找文件更新日是在距现在时刻二天以内的文件

find /root/ -mtime -2

2.在/root下查找文件更新日是在距现在时刻二天以上的文件

find /root/ -mtime +2

3.在/root下查找文件更新日是在距现在时刻一天以上二天以内的文件

find /root/ -mtime 2

注:-atime、-ctime与-mtime用法类似,可以自行查看man帮助。

4.查找文件更新日是在距现在时刻二分钟以内的文件

find ./ -mmin -2

5.查找文件更新日是在距现在时刻二分钟以上的文件

find ./ -mmin +2

6.查找文件更新日是在距现在时刻一分钟以上二分钟以内的文件

find ./ -mmin -2 -mmin 1

注:-amin、cmin与-mmin用法类似,可以自行查看man帮助。

7.查找文件更新时间比文件abc的内容更新时间新的文件

find ./ -newer abc
  1. 查找文件访问时间比文件abc的内容更新时间新的文件
find ./ -anewer abc
  1. 查找更改时间比文件file1新但比文件file2旧的文件。
find ./ -newer file1 ! file2

10.查找所有被修改超过50天以及少于100天的文件。

find / -mtime +50 -mtime -100

第五部分:根据大小查找文件

参数 描述
-size -n +n 按照文件大小查询文件,+n表示文件大小大于n,-n表示文件大小小于n。常用单位:k, M, G
  1. 查找在/tmp 目录下等于2M的文件
find /tmp -size 2M
  1. 查找在/tmp 目录下大于2M的文件
find /tmp -size +2M
  1. 查找在/tmp 目录下小于2M的文件
find /tmp -size -2M
  1. 找到大于50MB且小于100MB的所有文件。
find /tmp -size +50M -size -100M
  1. 查找超过10MB的所有.mp3文件,并使用一个命令删除它们。
find / -type f -name "*.mp3" -size +10M -exec rm {} ;

第五部分:查找的目录层级

参数 描述
-maxdepth n 查找到第n层
-mindepth n 第n层开始查找
  1. find 命令默认会递归查找整个目录树,而这非常消耗时间和资源。好在目录查找的深度可以手动指定。例如我们只想查找一到两层以内的子目录,可以通过 maxdepth 选项来指定。
find ./test -maxdepth 2 -name "*.php"

#maxdepth 为1,表明最多只查找一层内的子目录,也就是只查找当前文件夹。
find ./test -maxdepth 1 -name "*.php"

第六部分:反向查找

  1. 除了查找满足条件的文件之外,我们还可以查找不满足条件的所有文件。当我们知道要在查找中排除哪些文件时,这个选项就能发挥作用了。
find ./test -not -name "*.php"
  • 在上面的示例中我们找到了所有扩展名不是 php 的文件和文件夹。我们也可以使用感叹号"!"来代替 -not。
find ./test ! -name "*.php"
  1. 结合多个查找条件 我们可以同时使用多个查找条件来指定文件名并排除某些文件。
find ./test -name "abc" ! -name "*.php"

上面的命令查找所有以abc 开头并且不含 .php 扩展名的文件。这个示例展现了 find 命令自带的查找表达式是多么的强大。

第七部分:OR 操作符

当我们使用多个查找条件时, find 命令会将它们通过 AND 操作符(-a)结合起来,也就是说,只有满足所有条件的文件才会被列出。不过,如果我们需要进行基于 OR 运算的查找时,可以加上 -o开关。

find -name "*.php" -o -name "*.txt"

上面的命令查找所有以 .php 结尾或者以 .txt 结尾的文件。

第八部分:不在当前指定目录中查找

参数 描述
-prune 不在当前指定目录中查找

已知在一些目录下都有一个名为passwd的文件,我们看一下-prune的作用

  1. 在根目录及其子目录下查找名为passwd的文件
find / -name passwd

alt

  1. 在根目录及其子目录(除了/etc目录及其子目录)下查找名为passwd的文件。
find / -path /etc -prune -o -name passwd -print

alt

  1. 在根目录及其子目录(除了/usr/bin目录及其子目录;/etc目录及其子目录)下查找名为passwd的文件。由于命令行不能直接识别圆括号,因此要用转义字符\。
find / \( -path /usr -o -path /etc \) -prune -o -name "passwd" -print

alt

原文链接