find进阶

Shell Liemer_Lius 1150℃ 0评论

find命令有很多功能很实用,但平常用到的比较少,这里做一下整理和总结,以后方便查阅。

 

查找空文件目录:

find / -type f -size 0   // -size指定大小为0
find / -type f -empty    // 或-empty来指定空
find / -type d -empty    // 目录一样,只是type指定d即可。

查找时排除文件或者目录:

find / -name "*hello*" ! -name "*world*"  // 排除world关键词的hello关键词文件或目录的查找

对查找的文件进行操作:

xargs:不是find的选项,是管道后的操作。
find -name *.log |xargs rm -f   // 删除
find -name *.log |xargs chmod 755   // 赋权
find -name *.log |xargs grep hello   // 过滤文件中有hello字符串

exec:是find的选项,必须加”{} \;”,花括号之后要有空格

find -name *.sh -exec grep break {} \;

与-exec相似的是-ok,其会提示是否进行后面的操作,这样在用于删除的时候比较合适:

find -name "?.txt" -ok rm -rf {} \;   // ?匹配一个字符,查找a,b,c.txt,删除的时候键入y才可以删除。
< rm ... ./a.txt > ? y
< rm ... ./b.txt > ? y
< rm ... ./c.txt > ? y

直接删除查找到的文件:
ls ?.txt; find . -name "?.txt" -delete   
a.txt  b.txt  c.txt

-delete和rm -rf一样,不会提示是否删除,是直接删除的意思,这样就不用-exec rm {} \;或者|xargs rm了,省去了不少键入的时间。

多条件查找: -a(and), -o(or), !(not)是三个组合的条件:

find ./ -type f -o -type l   // 查找普通文件和链接文件

find ./ -name "*.txt" -a -type f  // 查找文件名为*.txt的普通文件

find ./ -name "*.log" ! -size 0   // 查找不为空的.log文件
lius@suse12:tmp> touch a.log b.log
lius@suse12:tmp> find ./ -name "*.log" ! -size 0
lius@suse12:tmp> echo hello > a.log
lius@suse12:tmp> find ./ -name "*.log" ! -size 0
./a.log

查找比某文件新或者旧的文件:

newer:修改时间更新的文件anewer:

访问时间更新的文件cewer:

修改时间更新的文件,包括属性的修改

lius@suse12:0122> ls -lrt |tail    // -nawer找比某文件新的文件
-rw-r----- 1 lius wheel   168 Jan 22 16:11 146.end
-rw-r----- 1 lius wheel   134 Jan 22 16:11 142.end
-rw-r----- 1 lius wheel    22 Jan 22 16:11 141.end
-rw-r----- 1 lius wheel   304 Jan 22 16:11 148.end
-rw-r----- 1 lius wheel    88 Jan 22 16:11 147.end
-rw-r----- 1 lius wheel   132 Jan 22 16:24 change.sh
-rw-r----- 1 lius wheel 18482 Jan 22 16:24 ziyuan.txt
-rw-r----- 1 lius wheel   228 Jan 22 16:34 check.sh
-rw-r----- 1 lius wheel   774 Jan 22 16:43 error.list
-rw-r----- 1 lius wheel    72 Jan 22 17:09 noping.list
lius@suse12:0122> find . -newer noping.list
.
lius@suse12:0122> find . -newer ziyuan.txt
.
./error.list
./noping.list
./check.sh

lius@suse12:0122> ls -lrt |head   // 加上!就是查找比某文件旧的文件。
total 152
-rw-r----- 1 lius wheel 18572 Jan 22 16:03 ziyuan1.list
-rw-r----- 1 lius wheel 18482 Jan 22 16:05 ziyuan.list
-rw-r----- 1 lius wheel    72 Jan 22 16:10 end.list
-rw-r----- 1 lius wheel   117 Jan 22 16:11 128.end
-rw-r----- 1 lius wheel   363 Jan 22 16:11 130.end
-rw-r----- 1 lius wheel   243 Jan 22 16:11 129.end
-rw-r----- 1 lius wheel   647 Jan 22 16:11 132.end
-rw-r----- 1 lius wheel   650 Jan 22 16:11 131.end
-rw-r----- 1 lius wheel    87 Jan 22 16:11 135.end
lius@suse12:0122> find . ! -newer 128.end |xargs ls -lrt
-rw-r----- 1 lius wheel 18572 Jan 22 16:03 ./ziyuan1.list
-rw-r----- 1 lius wheel 18482 Jan 22 16:05 ./ziyuan.list
-rw-r----- 1 lius wheel    72 Jan 22 16:10 ./end.list
-rw-r----- 1 lius wheel  4358 Jan 22 16:11 ./.end
-rw-r----- 1 lius wheel   117 Jan 22 16:11 ./128.end
lius@suse12:0122>

查找的文件格式化输出内容:

find . -name "*log" -printf "%f %a %M %s"
lius@suse12:tmp> find . -name "*txt" -printf "%f\t%a\t%M\t%s\n"
a.txt	Tue Feb 12 17:57:19.0638738228 2019	-rw-r-----	0
ip.txt	Wed Jan 16 22:26:33.0950923035 2019	-rw-r-----	258
ziyuan.txt	Tue Jan 22 16:24:23.0283328311 2019	-rw-r-----	18482
b.txt	Tue Feb 12 17:57:19.0638738228 2019	-rw-r-----	0
c.txt	Tue Feb 12 17:57:19.0638738228 2019	-rw-r-----	0

-printf有几个常用的选项,man可以查看printf中的一些特定格式,常用如下:
%f 文件名
%a 访问时间
%c 修改时间
%M 权限信息
%m 权限位信息
%s 文件大小,单位为字节
%d 文件所在目录层级
%u 文件所属用户
%p 带相对路径的完整名
%y 文件类型

条件分组:

find /data/gatewayLogs -mtime +7 -a \( -name 'server.business-*.log' -o -name 'server.channel-*.log' -o -name 'server.system-*.log' -o -name 'server.vertx-*.log' \) |while read LOG_FILE; do  # ()内分组,但是需要用\脱义
    echo $LOG_FILE
done

 

 

 

转载请注明:liutianfeng.com » find进阶

喜欢 (0)

发表回复