find命令使用指南

本文参考:https://www.cnblogs.com/johnnyliu/archive/2013/04/09/3010384.html
https://www.cnblogs.com/Ido-911/p/9638612.html
https://www.cnblogs.com/qiaopei/p/5515189.html

一直知道find命令的查找功能很强大,但从来没有进行系统性的学习,今天有时间正好学习一下!

find命令的基本组成:find [paths] [expression] [actions]

  • pathth:find命令的查询根路径,也可以通过参数 -path参数指定

  • expression: 查找条件

  • actions:对查找结果执行的操作

一、文件操作选项

-name 要查找的文件名

示例:
find /home/sifang/bin -name startcsgc 在/home/sifang/bin目录下查找名称为startcsgc的文件,如果忽略名称中的大小写,则使用-iname选项

-type 指定查找的文件类型
  • b 块设备文件
  • d 目录
  • c 文字设备文件
  • p 管道文件
  • l 符号链接文件
  • f 普通文件

示例:
find /home/sifang/bin -type f -name startcsgc 在/home/sifang/bin目录下查找名称为startcsgc的文件
find /home/sifang -type d -name bin 在/home/sifang目录下查找名称为bin的文件夹

-size n 指定文件大小,数字前+表示大于,-表示小于,常用单位c(字节),k(KB),M(MB)

示例:
find /home/sifang/bin -size +1M -type f | wc -l 查找大小大于1M的文件并统计个数
find /home/sifang/bin -size -10M -type f |wc -l 查找大小小于10M的文件并统计个数
find /home/sifang/bin -size +1M -and -size -10M -type f | wc -l 查找大小在[1M ,10M ]区间内的文件并统计个数。

二、时间选项

-atime n 最近访问过(accessed)的文件,单位为天

-amin n 最近访问过的文件,单位为分钟(minute)

-ctime n / -cmin n 最近状态改变过(changed)的文件

-mtime n / -mmin n 最近内容修改过(modified)的文件

-newer file ! otherfile 查找更新时间比file新的文件,加上!表示查找比otherfile旧的文件

示例:
find /home/sifang/bin -amin +10 -type f 十分钟前访问过的文件
find /home/sifang/bin -amin -10 -type f 最近十分钟内访问的文件
find /home/sifang/bin -amin +10 -and -amin -20 -type f,以当前时间为基准,在20分钟以内10分钟之前时间段访问过的文件
find /home/sifang/bin -newer a ! b 查找修改时间比a新但比b旧的文件

补充
linux系统中文件的三个时间,access time访问时间、modify time 修改时间、change time 状态变化时间,对于新建的文件,三个时间是相同的,可以通过stat 和ls命令查看。
stat filename,三个时间都显示
ls -lc filename 显示文件的change time
ls -lu filename 显示文件的access time
ls -l filename 显示文件的modify time

三、用户权限

-perm ddd 用户权限permission,通常用三位数字表示权限如644,ddd前+表示至少有一种指定的权限,-表示必须包括指定的所有权限

示例:
find ./ -perm 777 -type f -exec ls -l {}; 查找权限为777的文件

-user / -group 按文件属主、属组来查找文件

-nouser / -nogroup 查找没有有效属主/ 属组的文件,即该文件的属主在/etc/passwd文件中不存在

四、文件路径

-path 给出文件路径。可在路径中查询,可以用于指定查找路径的子路径,结合-prune指出要忽略的子目录

-depth 先匹配所有的文件,再在子目录查找

-maxdepth n,设定递归搜索的目录层级,1为当前目录,表示不递归搜索。

-prune指要忽略的目录,结合-path选项使用,忽略-path指定的目录。

示例:
find ./ -prune

五、对查询结果的操作命令

打印到标准输出

  -print,默认值

删除

  -delete

自定义命令

-exec command
command以;为结束标志,其中\是为了避免各个系统中;的不同意义,{}代表前面find查找出来的文件名。
示例:
find ./ -name aa -type f -exec ls -l {} \\; 在当前目录查找aa文件,并显示其详细信息。
find ./ -type f -mtime +14 -exec rm {} \\; 在当前目录查找14天之前修改的文件,并删除它们。
find每找到一个符合查找条件的文件都会执行后面的命令一次,如果想等查找到结束后再执行命令,则在命令最后添加+
现在假设需要将用户主目录下所有的 MP3 文件添加到压缩包 music.tar.gz 中,直观的感觉是,其命令应为如下形式:
find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} ';'
实际情况是,这样得到的 music.tar.gz 其实只包含一个 MP3 文件。原因是 find 命令每次发现一个音频文件,都会再执行一次 -exec 选项后面的压缩命令。导致先前生成的压缩包被覆盖。
可以先让 find 命令检索出所有符合条件的音频文件,再将得到的文件列表传递给后面的压缩命令。完整的命令如下:
find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} +

-ok command,功能同-exec,区别在于ok选项在执行命令时有交互式提示,提示你是否执行,是一种相对安全的做法。

示例:
find ./ -name aa -type f -ok ls -l {} \;

posted @ 2018-08-16 14:48  21summer  阅读(279)  评论(0编辑  收藏  举报