find过滤大小执行操作

1. find查找大小

find dir -type f # 仅查找文件

find -size 文件大小
例如
find -type f -size 100k # 查找大小为100k的文件

find -type f -size -20M # 查找小于20M(不含20M)的文件

find -type f -size +1G # 查找大于1G(含1G)的文件

find -type f -size +100k -size -211k # 查找文件大小在100k和210k之间的文件(-代表小于这个值,且不包含这个值。另大小仅支持整数)

但是这里有个坑,文件大小单位转换!
看下面这个文件
[root@it-no b]# du -b iat0007ffdc\@dx1755de9281b7513822.pcm 238720 iat0007ffdc@dx1755de9281b7513822.pcm [root@it-no b]# du -k iat0007ffdc\@dx1755de9281b7513822.pcm 233 iat0007ffdc@dx1755de9281b7513822.pcm [root@it-no b]# du -m iat0007ffdc\@dx1755de9281b7513822.pcm 1 iat0007ffdc@dx1755de9281b7513822.pcm
用不同的单位展示的大小分别是
b 238720 k 233 m 1

从上面可以看出du命令单位转换遵从1024,多余的小数点位会被舍弃,不足1的取1。所以在查找时如果查找大小为1M的文件,上面的这个会被查找到
[root@it-no a]# [root@it-no a]# find -type f -size -233k [root@it-no a]# find -type f -size 233k [root@it-no a]# find -type f -size +233k ./b/iat0007ffdc@dx1755de9281b7513822.pcm [root@it-no a]#
而查找大于1M的文件却找不到它

为了提高我们查找的准确性,我们吧查找单位缩小再来查询
[root@it-no a]# find -type f -size -233k [root@it-no a]# find -type f -size 233k [root@it-no a]# find -type f -size +233k ./b/iat0007ffdc@dx1755de9281b7513822.pcm [root@it-no a]#
可以发现只有查找大于233k能找到此文件,因为238720/1024=233.125 ......

2. find查找后执行

find dir -exec cmd {} ;
find dir -exec cmd {} +

例如查找结果如下:
[root@it-no all]# find -type f -size +100k -size -200k -name *765* ./part_2/iat00076551@dx1755db772637513822.pcm ./part_2/iat000765ac@dx1755db699b67389822.pcm ./part_4/iat00070e3c@dx1755dc76527a491822.pcm ./part_4/iat00076546@dx1755dd11d7c7513822.pcm ./part_4/iat000765e9@dx1755dbe04b7a4bd822.pcm ./part_1/iat00076765@dx1755db33143a44e822.pcm ./part_3/iat000765fa@dx1755db004f37389822.pcm ./part_3/iat000765d4@dx1755dd1fa0ba491822.pcm [root@it-no all]#

我们来执行看看; 和+的区别
[root@it-no all]# [root@it-no all]# find -type f -size +100k -size -200k -name *765* -exec ls {} \; ./part_2/iat00076551@dx1755db772637513822.pcm ./part_2/iat000765ac@dx1755db699b67389822.pcm ./part_4/iat00070e3c@dx1755dc76527a491822.pcm ./part_4/iat00076546@dx1755dd11d7c7513822.pcm ./part_4/iat000765e9@dx1755dbe04b7a4bd822.pcm ./part_1/iat00076765@dx1755db33143a44e822.pcm ./part_3/iat000765fa@dx1755db004f37389822.pcm ./part_3/iat000765d4@dx1755dd1fa0ba491822.pcm [root@it-no all]# find -type f -size +100k -size -200k -name *765* -exec ls {} + ./part_1/iat00076765@dx1755db33143a44e822.pcm ./part_3/iat000765d4@dx1755dd1fa0ba491822.pcm ./part_4/iat00076546@dx1755dd11d7c7513822.pcm ./part_2/iat00076551@dx1755db772637513822.pcm ./part_3/iat000765fa@dx1755db004f37389822.pcm ./part_4/iat000765e9@dx1755dbe04b7a4bd822.pcm ./part_2/iat000765ac@dx1755db699b67389822.pcm ./part_4/iat00070e3c@dx1755dc76527a491822.pcm [root@it-no all]#

可以看到;是对查找出来的文件逐个执行cmd,而+则是吧所有的查找结果一次性执行cmd。我们再看看下面的命令:
[root@it-no all]# [root@it-no all]# find -type f -size +100k -size -200k -name *765* -exec echo {} \; ./part_2/iat00076551@dx1755db772637513822.pcm ./part_2/iat000765ac@dx1755db699b67389822.pcm ./part_4/iat00070e3c@dx1755dc76527a491822.pcm ./part_4/iat00076546@dx1755dd11d7c7513822.pcm ./part_4/iat000765e9@dx1755dbe04b7a4bd822.pcm ./part_1/iat00076765@dx1755db33143a44e822.pcm ./part_3/iat000765fa@dx1755db004f37389822.pcm ./part_3/iat000765d4@dx1755dd1fa0ba491822.pcm [root@it-no all]# [root@it-no all]# find -type f -size +100k -size -200k -name *765* -exec echo {} + ./part_2/iat00076551@dx1755db772637513822.pcm ./part_2/iat000765ac@dx1755db699b67389822.pcm ./part_4/iat00070e3c@dx1755dc76527a491822.pcm ./part_4/iat00076546@dx1755dd11d7c7513822.pcm ./part_4/iat000765e9@dx1755dbe04b7a4bd822.pcm ./part_1/iat00076765@dx1755db33143a44e822.pcm ./part_3/iat000765fa@dx1755db004f37389822.pcm ./part_3/iat000765d4@dx1755dd1fa0ba491822.pcm [root@it-no all]#

这样是不是更明显了

最后我们来说下,其实exec后面只有两种模式【+】和【;】而我们知道;在shell中代表的是语句的结束,\是转义,那么;其实就是告诉我们的编译器这里的;并不是语句的分割,而是以【;】模式运行cmd
补充下前面这句话的示例

posted @ 2020-12-04 17:59  唐大侠的小迷弟  阅读(647)  评论(0编辑  收藏  举报