那年那日那朵花

".......(o´ω`o)......"

find用法详解

2016-10-03 16:30 linux

十一加班实在蛋疼,上上网刷刷手机,内心已经按捺不住要回去打昆特牌的冲动了= =。。。思来想去还是装装逼好了,故归(chao)纳(hui)下(shu)find用法。

根据文件名查找

根据文件名查找应该是用的最多的,下面就是查找当前目录下后缀名为txt的文件。这里-print 加不加都无所谓

find . -name "*.txt" -print

如果是 -iname参数的话就是忽略大小写

多条件匹配,查找后缀名txt或者后缀名pdf的文件

find . \( -name ".txt" -o -name ".pdf" \) -print

根据文件路径来查询

就是说当前目录下有多个目录 查询子目录中包含目录nfs下的文件,像这样

[root@server01 lib]# pwd
/var/lib
[root@server01 lib]# find . -path "*/nfs/*"
./nfs/etab
./nfs/rmtab
./nfs/rpc_pipefs
./nfs/rpc_pipefs/gssd
./nfs/rpc_pipefs/gssd/clntXX
./nfs/rpc_pipefs/gssd/clntXX/gssd
./nfs/rpc_pipefs/gssd/clntXX/info
./nfs/rpc_pipefs/nfsd
./nfs/rpc_pipefs/cache
./nfs/rpc_pipefs/nfsd4_cb
./nfs/rpc_pipefs/statd
./nfs/rpc_pipefs/portmap
./nfs/rpc_pipefs/nfs
./nfs/rpc_pipefs/mount
./nfs/rpc_pipefs/lockd
./nfs/statd
./nfs/statd/sm
./nfs/statd/sm.bak
./nfs/state
./nfs/v4recovery
./nfs/xtab

然后-regex参数是使用正则表达式(这个我觉得是万能的),然后iregex也是指忽略大小写的意思,这里是查找后缀名为.py和.sh的文件

find . -regex ".*\(\.py\|\.sh\)$"

还有否定参数,匹配不以txt作为后缀名的文件

find . ! -name "*.txt" -print

根据目录深度

这个很有用的主要是 -maxdepth 参数,根据最大目录深度

find . -maxdepth 1 -regex ".*\(\.py\|\.sh\)$"

目录深度为1 就是指当前目录,这个特别有用。

然后是-mindepth 最小目录深度,这个其实用的不多(好吧,我其实一次都没用到过= =),打印出目录深度至少为3的文件,当前目录的和下一级目录的可不会打印哦

find . -mindepth 3 -regex ".*\(\.py\|\.sh\)$"

根据文件类型

这个用的相当多了

find . -type f -print
文件类型为文件
find . -type d -print
文件类型为目录
find . -type l -print
文件类型为符号链接
find . -type c -print
文件类型为字符设备
find . -type b -print
文件类型为块设备
find . -type s -print
文件类型为socket套接字
find . -type p -print
文件类型为FIFO(其实我tm不知道这是个啥东西)

根据文件时间

文件的时间有三种
访问时间 -atime
修改时间 -mtime
变化时间 -ctime

单位是天,+表示大于 -表示小于 没符号表示等于

还有单位为分钟的

-amin
-mmin
-cmin

find . -type f -mmin -10 -print
打印当前目录下文件类型是文件 且修改时间在10分钟内的文件

基于文件大小

find . -type f -size +2k
find . -type f -size +2k
find . -type f -size -2k

常用的单位有k M G

基于文件的权限

find . -type f -perm 644 -print
打印权限为 644 的文件

find 与 exec 结合

把查找出的文件替换权限
find . -type f -user root -exec chown hu {} \;

把查找出的文件重定向到新的文件
find . -type f -name "*.log" -exec cat {} \; >alllog.txt

把查找出的10天前的文件备份起来
find . -type f -mtime +10 -name "*.log" -exec cp {} BAK \;

find 跳过指定目录

跳过day目录下 查找后缀名为txt的文件然后统计行数再以一定规律排序
find . \( -name "day" -prune \) -o \( -name "*.txt" \) -type f -print0 |xargs -0 wc -l|sort -t"/" -k2 --n |grep -v total

find 与xargs 结合

删除查找到的文件
find . -type f -name "*.txt" -print0 |xargs -0 rm -rf
这里为啥是 -print0和xargs -0呢,因为很多文件名中可能会带有空格xargs会误以为是定界符,aa bb.txt 就会被当成 aa 和 bb.txt两个文件 -print0就是以字符null '\0'来分隔。xargs -0 将\0当作定界符

恩,好吧我承认了,以上用法都是抄书抄来的 。。。= =,不过确实除了常用的方法外,有些点一直记不住。乘着没啥事,写写博文,装装逼,快点回家可以浪了。。。。。

Cloudhu 个人随笔|built by django|

沪ICP备16019452号-1