Linux的秘密:这才是find的正确使用姿势

Linux的秘密:这才是find的正确使用姿势

毋庸置疑的,作为一个经常要和Linux打交道的开发人员而言,find都是我们日常工具箱中使用最频繁的命令行工具之一,因此其实是很值得我们花费更多时间,来研究一下他的用法的。

最差的find实践:find 路径名

find命令所需要的最少的一个参数,是所要搜寻的路径。比如,我们可以这样来使用find命令:

find /

天哪,你的屏幕迅速滚动起来了!这完全没用,甚至还不如使用ls命令。显然的,到了我们需要做点什么的时候了。

稍微好一点:加上-name参数

好吧,也许你只是想在当前用户主目录中找到所有的jpg文件。 使用-name参数,可以帮助你实现这个目标。

find ~ -name '*jpg'

可是,我记得我藏了一个很......的图片在一个很深的目录里面,它哪里去了?或许?

Linux的秘密:这才是find的正确使用姿势

它的扩展名可能是大写的,比如这样:JPG?

嗯,很多图片一不小心就会存成这样,所幸的是,find也想到了这一点!用-iname来替代-name吧,就像下面那样,它的优点是,可以把不管是大写还是小写,还是半大写半小写的都给搜出来,嗯,这在模式匹配中叫什么来着,对了:大小写无关性。

find ~ -iname '*jpg'

等等,好像出来一些了,但我记得我存了很多啊,怎么只有这几个文件?嗯,或许你的是另外的一种情况:

它的扩展名可能不仅仅包括jpg,也包括jpeg

一定是这样!一些图片可能就是有一个.jpeg扩展名。 幸运的是,我们可以将模式与由-o表示的“或”组合起来,一起使用,比如像下面这样:

find ~ \( -iname '*jpeg' -o -iname '*jpg' \)

这里有两点是需要特别说明的:

  • 作为一个二元操作符,-o要求或的部分整体用小括号扩起来,但需要注意命令行中但转义,这是必须的

  • 与此同时,括号和对应的操作值,比如这里的-iname '*jpeg'之间,至少要有一个空格

Perfect!唯一有点儿美中不足的,是还不够清爽啊,天知道当时,我怎么会心血来潮的把这些文件所在的目录,命名为什么jueMiJpg,gongzuoJpg的,莫非是为了表示这是正儿八经的图片文件夹?

可是我现在,只想找到这些文件啊!

Linux的秘密:这才是find的正确使用姿势

-type f参数登场

Linux的哲学告诉我们,只要我们想到,就一定能在Linux下办到。是的,-type f参数,就是解决这一问题的利器,它像一个管道一样,将只查找并输出文件,而不包括文件夹:

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f

当然,既然有-type f,也肯定会有-type d,说不定我以后就是想找那些命名古怪的目录,以便稍后重命名它们呢:

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type d

好吧,这可能还是不能令老板满意,就在上周,他要求设计师鼓捣100张图片出来,但现在整个目录下,有近1,000个文件,我怎么直到哪些是上周提交的啊?需要写一个脚本?

答案是:不!因为我们可以:

建立基于find的时间粒度查找器

Linux的秘密:这才是find的正确使用姿势

Linux下,每个文件都包含有3个重要的时间点,在find命令中,则对应表达为:

  • 创建日期:-ctime

  • 最后修改日期:-mtime

  • 最近一次访问日期:-atime

这里,当然是要用-mtime,我们的策略则是:查下最近7天内,设计师提交了多少图片,这里,要用到的是时间运算符号是减号(-),它代表了n天内,比如这样:

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7

把结果输出出来,然后统计下个数,就能向老板交差了。

其他的时间粒度和运算符号

既然有减号(-),那自然就有加号(+),在find的时间粒度查找中,加号(+)表示什么呢?意思很清楚,n天前,所以下面的逻辑关系应该是成立的:

 find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7+ find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime +7---------------------------------------------------------------------- find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f

那如果我想更细一些的时间粒度呢?比如不是天?这方面,find可以到达的粒度是分钟,对应着ctime、mtime和atime,有cmin、mmin和amin供我们使用,不过应该用不着吧?

处理完了照片的事情,也许需要来关心关心磁盘的空间了,作为日常的维护,我们总是要定期的把那些已经过期(比如30天前),但巨大(比如大于1G)的log清理掉,第一步当然就是找出它们:

通过-size参数确定所需查找文件的大小

find /var/log -size +1G -mtime +30

好了,我觉得我已经够多了。find的所有技巧都在这了么?当然不是,比如你或许可能还会看到这样的find命令:

find /data -owner root

它代表查询所有拥有者是root的文件,又或许,有这样的命令

find ~ -perm -o=r

它将在当前主目录下,查找出所有只读的文件,以确保你不会过度的分享。所以,这篇文章其实只是抓住了可以做的事情的表面。通过和比如正则,以及布尔逻辑相结合,可以为您提供难以置信的find查找的灵活性,以便准确找到要查找的文件。

你还喜欢哪些find的表达式? 在评论中分享他们吧!


分享到:


相關文章: