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进阶
发表回复
要发表评论,您必须先登录。