打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Linux 的查找Find和强大的Find.
一、find 命令格式
1、find命令的一般形式为;
find pathname -options [-print -exec -ok ...]
2、find命令的参数;
-pathname: find命令所查找的目录路径。例如/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-printf: 按照指定格式输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {  } \;,注意{   }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
3、使用find查找文件的时候怎么避开某个文件目录
比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件
find /usr/sam -path "/usr/sam/dir1" -prune -o -print
find [-path ..] [expression] 在路径列表的后面的是表达式
-path “/usr/sam” -prune -o -print 是 -path “/usr/sam” -a -prune -o
-print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path “/usr/sam” 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path “/usr/sam” -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。
这个表达式组合特例可以用伪码写为
if -path "/usr/sam"  then
-prune
else
-print
避开多个文件夹
find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print
圆括号表示表达式的结合。
\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。
查找某一确定文件,-name等选项加在-o 之后
find /usr/sam  \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print
3、查找某段时间内修改的文件
例子 :find . -type f -newermt '2016-01-01 00:00:00' ! -newermt '2016-02-01 12:00:00' -exec grep aaaa {} \;
find -newerXY file/time:
XY为占位符->a、B、m、c、t分别代表上次访问时间、创建时间、上次modify时间、上次索引节点改变时间和绝对时间;
find根据Y的值来计算file的某个时间戳,然后根据X的值来做匹配。t不能做X。
1
find . -name "*.txt" -mtime -1
//以上为1小时以内的当前目录内修改的所有为txt格式的文件. 其中-1为1小时以内, +1为1小时之前
find . -mmin -10 //查找10分钟内当前目录内修改的所有文件
1
find . -mmin -10 //查找10分钟内当前目录内修改的所有文件
find . -mmin +10 //查找<span style="color: #ff0000;">1小时内,10分钟外当前目录内修改的所有文件
1
find . -mmin +10 //查找<span style="color: #ff0000;">1小时内,10分钟外当前目录内修改的所有文件
//-mmin为查找1小时内的按照分钟计算的修改文件
find . -newer a.txt //查找10分钟内当前目录内修改的所有文件
1
find . -newer a.txt //查找10分钟内当前目录内修改的所有文件
//查找当前目录下(递归子目录)的所有修改时间在a.txt之后(所以文件更新)的文件和目录
以下不常用
find命令用于查找文件和目录,任何位于参数之前的字符串都将被视为欲查找的目录。
find 可以指定查找条件如名称,类型,时间,文件大小,权限和所有者查找,针对多个条件进行与或非的逻辑运算。我们可以控制find的查找的行为,还可以和其他命令组合使用。
find
find .
find . -print
三者等效, 查找当前目录下所有的文件和目录(递归子目录),以每行一个文件或者目录的形式列举出,不包含隐藏文件
find lib opt bin
同上,查找指定的多个目录(lib/opt/bin)
二 强大的find命令 指定
指定条件查找
1 按名称查找
find . -name readme.txt
查找当前目录下(递归子目录)的所有名为readme.txt的文件
find . -name \*.txt
find . -name “*.txt”
查找当前目录下(递归子目录)的所有名称以.txt结尾的文件,注意*号的写法,需要前面加\或者放到双引号中
find . -iname \*.txt
默认find是区分大小写的,如果不想区分大小写,请使用-iname替代-name,如上则”abc.TXT”将被查找到
2 按类型查找
find . -type d
查找当前目录下(递归子目录)的所有目录
find . -type f
查找当前目录下(递归子目录)的所有文件
find . -type l
查找当前目录下(递归子目录)的所有符号链接
3 从当前时间查找
3.1. 以小时为单位的时间
find 命令三个选项用于按照时间查找,单位都是小时:
mtime — 文件内容上次修改时间
atime — 文件被读取或访问的时间
ctime — 文件状态变化时间
这三个选项都需要配置一个n值使用,可以是-n / n / +n:
-n 小于 n
n 正好与 n 相等
+n 大于 n
find . -mtime -1
查找当前目录下(递归子目录)的所有1小时内修改的文件和目录
find . -mtime +1
查找当前目录下(递归子目录)的所有修改时间超过1小时的文件和目录
find . -mtime 1
查找当前目录下(递归子目录)的所有恰好在1小时前修改的文件和目录
3.2. 以分钟为单位的时间
用法和*time类似,mmin、amin和cmin 的不同在于单位时间是分钟,用于查找在不到1小时的时间内变化了的文件和目录
find . -mmin -10
查找当前目录下(递归子目录)的所有10分钟内修改的文件和目录
find . -mmin +20
查找当前目录下(递归子目录)的所有20分钟外1小时内修改的文件和目录
3.3. 与特定的文件的时间比较
-newer,-anewer和-cnewer选项用于查找与特定的文件比较的已修改或访问过的文件,类似mtime,atime和ctime
-newer 指内容最近被修改的文件
-anewer 指最近被读取过的文件
-cnewer 指状态最近发生变化的文件
find . -newer a.txt
查找当前目录下(递归子目录)的所有修改时间在a.txt之后(所以文件更新)的文件和目录
与特定时间比较
find . -type f -newermt '2016-01-01 00:00:00' ! -newermt '2016-02-01 12:00:00'
4  按文件大小查找
4.1. -size 选项用于查找满足指定的大小条件的文件(注意不查找目录), +表示大于, -表示小于, 没有+1表示正好等于。文件大小的单位可以是字节(用c表示), kb(用k表示)。
find . -size -100c
查找当前目录下(递归子目录)的所有文件大小小于100字节的文件
find . -size +100k
查找当前目录下(递归子目录)的所有文件大小大于100k的文件
find . -size 0
查找当前目录下(递归子目录)的所有文件大小为0的文件
4.2. -empty 查找空文件和空文件夹, 和-size 0不同的在于-size 0 只查找空文件,或者说-empty -type f 等同于-size 0 :
find . -empty
查找当前目录下(递归子目录)的所有文件大小为0的文件和空文件夹
find . -empty -type f
查找当前目录下(递归子目录)的所有文件大小为0的文件
find . -empty -type d
查找当前目录下(递归子目录)的所有空目录
5  按权限和所有者查找
find . -perm 777
查找当前目录下(递归子目录)的所有权限为777的文件和目录
find . -perm -u=rwx
查找当前目录下(递归子目录)的所有user权限为rwx的文件和目录
find . -perm -ug=x
查找当前目录下(递归子目录)的所有user和group权限为x的文件和目录
find . -user sky
查找当前目录下(递归子目录)的所有user为sky的文件和目录
find . -group users
查找当前目录下(递归子目录)的所有group为users的文件和目录
查找条件的逻辑运算
1. 逻辑与
find . -name “*.java” -size -mmin -10
find . -name “*.java” -a -size -mmin -10
查找当前目录下(递归子目录)的所有名为*.java并且修改时间在10分钟之内的文件,-a是默认选项
2. 逻辑或
find . -name “*.class” -o -name “*.jar”
查找当前目录下(递归子目录)的所有名为*.class或者*.jar的文件和目录
3. 逻辑非
find . ! -user sky
查找当前目录下(递归子目录)的所有user不是sky的文件和目录
控制查找的行为
find . -maxdepth 3 -name “*.txt”
查找当前目录下(递归子目录)的所有名为*.txt的文件,目录深度不超过3层
find . -maxdepth 1 -name “*.txt”
查找当前目录下(不递归子目录,因为maxdepth为1)的所有名为*.txt的文件
find . -mindepth 3 -name “*.txt”
查找当前目录下(递归子目录)的所有名为*.txt的文件,目录深度不低于3层
find . -mindepth 1 -name “*.txt”
查找当前目录下的子目录中(递归子目录)的所有名为*.txt的文件,不包含当前目录
find . -depth -name “*.txt”
查找当前目录下(递归子目录)的所有名为*.txt的文件,每个目录都是先在目录中进行查找,然后才继续查找其子目录
find和其他命令的组合
find . -name “*.jar” -exec ls -l {} \;
find . -name “*.jar” -ls
查找当前目录下(递归子目录)的所有*.jar文件并使用ls -l列出详细信息
find . -name “*.java” -exec grep HashMap {} \;
查找当前目录下(递归子目录)的所有的含有”HashMap”字样的*.java文件
find . -name “*.sh” -exec mv {} backup \;
查找当前目录下(递归子目录)的所有的*.sh文件并移动到backup目录中
我们经常要在日常的工作中查找文件,要说linux下最强大的文件查找工具,非find莫属。find可以从文件名、读取修改时间、大小、类型等等来筛选文件,可以完成日常几乎所有的查找需求。
来看一个简单的例子:
find /tmp/ -name 'galeki*’
意思就是在/tmp目录下找出以“galeki”开头的文件,-name指出是对文件名进行筛选,是不是很简单明了?除了文件名,find还有更强大的筛选条件:
1.时间:
参数 意义
-atime n 上一次存取时间在n*24小时前以内的文件
-ctime n 上一次状态改变在n*24小时前以内的文件
-mtime n 上一次修改时间在n*24小时前以内的文件
-newer file 比file所指的文件还要新的文件
2.大小:
参数 意义
-size n[bkMG] 大小为n(b为比特,k为KB,M为MB,G为GB)的文件
3.所有者:
参数 意义
-user name 所有者用户名称是name的文件
-group name 所有者用户组群名称是name的文件
例子:
find /tmp/ -name 'sess*’ -mtime 1 #在/tmp目录下找到所有以’sess’开头、并且在一个小时以内修改过的文件
find ./ -name '*.zip’ -size 546k  #在当前目录下找到所有546KB的zip压缩包文件
find /tmp/ -user 'galeki’               #在/tmp目录下找到所有所有者为galeki的文件
另外,还可以用”+”、”-“来进一步修饰时间和大小的条件:
find src/ -mtime +2        #找出src目录下上一次修改时间在2天以前的文件
find download/ -size +50M    #在download目录下找出大于50M的文件
光找出文件还不够,我们还要对找出的文件进行处理才有意义,一般来讲可以把find的查找结果传递给其他的命令做进一步处理。find本身也提供了许多处理动作的选项。
常用的处理动作:
参数 意义
-print
打印出找出文件的完整地址,一个文件一行
-delete
删除找出的文件
-exec command {} \;
对每一个找到的文件执行command命令,
并用文件替换”{}”,“\;”是固定的结束符。
例子:
find /tmp/ -ctime +7 -delete     #删除/tmp目录下一周以前创建的文件
find ./ -name '*.unk’ -exec file {} \;  #找出当前文件夹下后缀是unk的文件,并用file命令显示每个文件的文件类型
========================
查找并打包:
find . -name “*.txt” -mtime -1 |xargs -n 100 tar -rvf 20110902.tar
//查找当前文件夹下所有1天内修改的txt文件并打包为20110902.tar
find ./ -name “*[cC][aA][mM][eE][rR][aA]*.*” -ok tar -czvf my.tar.gz {} \
========================
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
系统总结一波Linux下find命令,查找就是这么清晰
Shell脚本100例:39 find命令大全
find最近一天修改过的文件
linux之用xargs删除这个目录下面后缀为txt的文件(包括子目录)
用rm递归递归删除子目录下所有.o后缀文件
find命令
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服