linux中find命令的详细用法

"find命令中诸如--name等并不是find的参数,而是表达式中的内容"

Posted by Xion on August 19, 2016      views:

FIND(1) in Linux

find 其实也算是很常用的命令,但是平时自己用的功能都比较菜,所以全面的整理一下。 这里应该囊括了几乎所有的find的用法

1、find 命令后的参数

之前一直对find后加的参数有误解,直到看了资料之后才明白是怎么回事,一般而言,find 的语法规则是这样的:

$ find [-H] [-L] [-P] [-D debug选项] [-Olevel] [搜索的目录] [表达式]

2、find的参数

其实find的参数很少,就5个:

  • -P 表示不追随符号链接
  • -L 表示追随符号链接
  • -H 表示只追随命令行中的符号链接
  • -D debug的选项,一般的使用者不关心这个。
  • -O 开启查询的优化有1,2,3级。

3、find的表达式

所谓的表达是,值得就是find用于限定要搜索的文件的范围的表达式。

例如“find -name abc”中 “-name abc”这个部分就是一个表达式

find的表达式元素的类型

  • Test 用于判断的表达式,返回true或者是false。
    • 例如 –empty 用于检测一个文件是否为空,为空就返回1。
  • Action 是对符合test标准的文件的行为.
    • 例如 -print 在标准输出打印文件的名字。
  • Clobal options 影响全部的 test 和 action。
    • 例如 -depth 让搜索以深度优先。
  • Positional options 影响之后的test 或者 action。
    • 例如 -regextype选项 之后可以选择regex的类型
  • Operators 用于逻辑表达,-a and -o or 默认的是-a

通过上面这些表达是元素的组合,我们就能进行find操作了

4、find表达式中的”POSITIONAL OPTIONS”的表达

positional options 影响之后的test或者action

  • -daystart 今天发生变化内的文件(包括今天内的改动、访问等等)
  • -regextype type 改变之后在-regex 和 -iregex后的正则语句的语法(find支持的正则语法有:emacs、posix-awk、posix-basic、posix-egrep、posix-extended)
  • -warn 是否输出警告信息

5、find表达式中的”GLOBAL OPTIONS”

Clobal options 影响全部的 test 和 action

  • -d,-depth 深度优先进行操作,例如使用-delte的时候,会先删除文件夹中的内容再删除文件夹。
  • -help,–help 这个不用解释了
  • -ignore_readdir_race 通常如果在find的过程中,find的内容发生了变化。这个参数的作用是忽略它
  • -noignore_readdir_race。不忽略上面这种情况
  • -maxdept 搜索深度上限
  • -mindepth 搜索深度下限,例如-mindepth 2 会忽略两层以内的所有文件,即使他们可能满足你的测试。
  • -mount 只会在当前的文件系统中搜索,不会搜索其他挂载的文件系统
  • -noleaf 如果在非Unix规范的文件系统中搜索,需要加上这个选项。

6、find表达式中的”TEST”

TEST是搜索的条件

常识

在TEST中的数值可以有三种表达
+n    表达大于n
-n    表示小于n
 n    就是n

6.1TEST中的时间相关的表达

这里的n都是数值,所以可以套用上面的规范,例如:

-amin -4表示4分钟内访问的文件
-amin +4表示4分钟之前访问的文件
-amin 4表示正好4分钟前访问的文件

  • -amin n “access minite”就是在n分钟之前访问的文件(这里的n属于上面的数值表达),例如 -amin -4表示4分钟内访问的文件
  • -atime n 在n*24小时内访问的文件,不满24小时的部分会被忽略。这里的n通常结合+, -使用。例如 -atime -1 表示一天内访问的文件
  • -cmin n 在n分钟前,被改变状态的文件(例如 读写权限,所属等)
  • -ctime n 在n天内,被改变状态的文件
  • -mmin n 在n分钟前,被修改的文件
  • -mtime n 在n天内,被修改的文件
  • -used n 这个文件最后的访问时间在它最后修改时间的n天后

  • -anewer file 在访问“file”前访问的文件
  • -cnewer file 在修改文件状态“file”前修改文件状态的文件
  • -newer file 在修改“file”前修改的文件

  • -newerXY reference 这里的XY也是参数,如果X比Y新的话就返回真。XY可以的取值如下
    • a 文件”reference”的访问时间
    • B 文件”reference”的创建(birth)时间
    • c 文件”reference”的inode状态改变的时间 inode包含文件的元信息,具体来说有以下内容:
      • 文件的字节数
      • 文件拥有者的User ID
      • 文件的Group ID
      • 文件的读、写、执行权限
      • 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
      • 链接数,即有多少文件名指向这个inode
      • *///////文件数据block的位置
    • m 文件”reference”的修改时间
    • t “reference”会被直接作为一个时间处理 例如: -newermt “2012-12-4 12:10:04” 表示在这个时间后修改的文件

6.2TEST中的用户相关的表达

  • -nogroup 没有组的文件
  • -gid n 文件的组id是n
  • -group gname 以gname为组名的组拥有的文件

  • -nouser 没有用户的文件
    • -uid n 以n为uid的用户拥有的文件
  • -user name “name”用户拥有的文件

6.3TEST中的文件相关的表达

  • -empty 文件是个空文件
  • -fsytpe type 文件在type类型的文件系统上。

  • -name pattern 匹配文件名
  • -ilname pattern 大小写敏感的匹配
  • -iname pattern 大小写不敏感的匹配
  • -lname pattern 文件是一个符号链接,并且内容匹配pattern

  • -ipath pattern 大小写敏感的路劲匹配
  • -path pattern 匹配完整的文件名(包括路劲的文件名)
  • -iwholename pattern和ipath是一样的意思
  • ipath patthern 和path是一样的意思
  • -iregex pattern 大小写敏感的正则匹配
  • -regex pattern 正则匹配,匹配的时候匹配整个路劲,而不是文件名。默认使用的是Emacs的正则匹配。

  • -links n 文件有n个链接

  • -samefile 同一个文件
  • -inum n 这个文件的i节点编号为n,一般而言,用–samefile更方便

  • -size n[cwbkMG] 文件大小为n(会经过四舍五入)的文件,可以用+n表示大于n,-n表示小于n的形式。
  • -type c 类型为c的文件,c可以的选择如下
    • b 块设备
    • c 字符设备
    • d 文件夹
    • p 命名管道
    • f 常规问价
    • l 符号链接
    • s 套接字
    • d d门(solaris中的)
  • -xtype c 与type类似,但是在处理符号链接的时候有区别

  • -context (在SELinux中)匹配的安全上下文的文件

6.4TEST中的权限相关的表达

  • -perm mode 匹配文件权限刚好为mode的文件,mode可以是 ‘g=w’或者‘0020’
  • -perm -mode 匹配拥有mode所有权限的文件
  • -perm /mode 匹配拥有mode任何权限的文件
  • -readable 可读的文件
  • -writable 可以写的文件
  • -executable 有x的文件或者目录,对于文件x表示可执行,对于目录x表示可搜索。

7、find表达式中的”ACTION”

ACTION可以执行一些操作,结合TEST和ACTION可是灵活的实现一些功能

  • -delete 删除找到的文件,如果成功放回真,如果失败返回非零值。 **
  • -exec command 执行command。之后所有的命令都会作为exec的参数,直到遇到一个;,在实际的使用中需要对;转义。find找到的参数,可以用{}来替换。
    • 例如find * -exec rm {} -rf \;就是删除该目录下的所有文件
  • -exec command {} + 这个和之前相同,但是不是把每个文件都作为一次参数,而是把所有文件并列作为参数
    • 使用“find * -exec echo {} \;” 和 “find * -exec echo {} \+”可以很清楚的显示他们的区别
  • -execdir command ;
  • -execdir command {}+ 这两个与exec比较类似,但是传入的参数不是完整的路劲,而是匹配到的路劲。
    • 例如 find -name ‘*’ -execdir echo {} \;会打印出当前文件夹下所有文件的文件名,而不是相对的路基名
  • -ok command ; 类似于-exec,但是带询问的执行命令
  • -okdir command ; 类似与execdir,但是带询问的执行命令 **
  • -fls file 把输出结果按照ls的格式打印到file文件中
  • -fprint file 把完整的文件名输出都一个文件中每个文件名之后是一个新的行
  • -fprint0 file 把文件的文件名输出到一个文件中,每个文件名之后是一个null字符
  • -ls 按照ls的格式打印找到的文件
  • -print 打印找到的文件的全名,每个名字后是一个新的行
  • -fprint0 打印找到的文件的全名,每个名字后跟一个null字符 **
  • -prunt True;如果文件是一个目录,不进入它。

8、操作符

  • (表达式) 优先处理括号中的表达
  • ! 表达式 非表达式
  • -not 与 ! 一样
  • 表达式1 表达式2 默认他们是and关系
  • 表达式1 -a 表达式2 和上面相同

  • 表达式1 -o 表达式2 或的关系
  • 表达式1,表达式2 他们是并列的关系,表达式1的值会被丢弃。