在Linux的世界当中,文件查找是最普遍的功能,然后该功能却有着极其复杂的命令与参数相匹配。文件查找有大致三个以下命令:
- find
- whereis
- locate
其中难易程度之首为find,下面我们就来细说下find的命令用法,以及我收集的常用案例。
find命令的基本形式:
find pathname -options [-print -exec -ok]
- pathname :find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
- -print :对匹配的文件输出到标准输出,该命令一般会和xargs来搭配使用(在后面我们会说到)。
- -exec :对匹配的文件执行所给出的shell命令。
- -ok :与-exec作用相同,只不过以一种更为安全的模式来执行shell命令,例如当执行rm命令的时候,会提示是否删除。
find命令的参数选项:
- -name :按照文件名称来查找文件。
- -perm :按照文件权限来查找文件。
- -mtime :按照更改文件数据的天数来查找文件。其中附加参数为:n (当前n天)、-n(n天以内)、+n(n天以前)。具体我会在下面的案例来细讲。
- -mmin :按照更改文件数据的分钟来查找文件。附参数同上。
- -atime :按照访问文件的天数来查找文件。附参数同上。
- -amin :按照访问文件的分钟来查找文件。附参数同上。
- -ctime :按照更改文件状态的天数来查找文件。附参数同上。
- -cmin :按照更改文件状态的分钟来查找文件。附参数同上。
- -size :按照文件大小来查找文件。
- -depth :在查找文件时,遍历完当前目录文件邮件后,在对其子目录进行查找。
- -type :按照文件类型来查找文件。f - 普通文件、d - 目录、l - 符号链接文件、b - 块设备文件、c - 字符设备文件、p - 管道文件。
- -newer :比对文件的新旧。
- -user :根据用户名来查询文件。
- -maxdepth : 限制查询目录的深度。
-exec 详解:
我们查找文件的目的就是为了对其的后续操作,如查看、删除、修改权限等等之类的操作。这就是-exec的作用所在。其中使用-exec时不得不说的两个关键字:{} 与\;。
显示当前目录中,权限为774的所有文件,并显示其相关信息。
# find . -type f -perm 774 -exec ls -l {} \;
- {}代表的是“由find找到的内容”,如上图所示,find的结果会被放置到{}位置中。
- -exec一直到“\;”是关键字,代表find额外命令的开始(-exec)到结束(\;),在这中间的就是find命令内的额外命令。就是本例中的“ls -l {}”
- 因为“;”在bash环境下是有特殊意义的,因此利用反斜杠来转义。
find命令案例:
1、查找当前用户目录下的所有文件
# find $HOME -print # find ~ -print
2、查找当天所修改过的文件
# find / -type f -mtime 0 -exec ls -l {} \;
以上的命令并不是完全的正确,因为0代表目前的时间。也就是从现在到24小时前。还有就是尽量不要使用/根目录开头,原因应该大家都知道-_-!。
3、查找/var/logs目录中3天前所修改的文件,并删除。
# find /var/logs -type f -mtime +3 -ok rm {} \;
在这里需要说明的有两点,关于时间的 -符号、+符号、和没有符号的区别。
以上的草图我想已经很清楚其区别了。
- -3 :代表过去3天内。
- +3 :代表过去3天前。
- 3 :代表过去3天前的当天。
另一个就是-ok,在使用-ok删除文件的时候,它会询问你是否删除,反之使用-exec的话就直接删除掉了。
4、查找当前目录中文件大于50kb的文件,并显示。
# find . -type f -size +50k -exec ls -l {} \;
- k :代表1024bytes。
- c :代笔byte(字节)。
- +50k :大于50kb的文件。
- -50k :小于50kb的文件。
- 50 :等于50kb的文件。
5、查找权限为755的文件,并显示
# find . -perm 755 -exec ls -l {} \;
6、查询后缀txt的目录,且不遍历子目录
# find . -maxdepth 1 -name "*.txt" -exec ls -l {} \;
文件查找之locate
locate [-ir] keyword
- -i :忽略大小写的差异。
- -r :后面可接正则表达式。
locate的文件查找要比find命令快。之所以快是因为locate寻找的数据是由已创建的数据库/var/lib/mlocate里面的数据所查找到的,所以不用直接在去硬盘当中访问数据。但locate有其自己的限制。
那么有什么限制呢?就是因为它是经由数据库来查找的,而数据库的创建默认是每天执行一次(每个distribution都不同,CentOS 5.x是每天更新数据库一次),所以当你新建文件后查找该文件,那么locate会告诉你“找不到”。
那是否可以手动更新数据库么?答案当然是可以。
# updatedb
使用上述命令就可以更新数据库。updatedb命令会去读取/etc/updatedb.conf这个配置文件的设置。