日期:2014-05-16  浏览次数:20873 次

Linux下查找文件的一些应用场景
在实际应用中,我们经常会遇到各种查找文件的需求,比如:
查找最新的n个文件
查找包含某字符串的文件
查找昨天修改的文件
查找同级目录下,不同文件的最新一个文件(类似于数据库的分组查询场景:按名称分组,查询最新的文件)
等等
有木有?
?
?
下面是一些应用场景:
?
?
1、查找最近修改的文件
1)最近24小时内修改的文件
[sam@strong shelltest]$ find /opt/shell/tomcat-6.0.37/logs -mtime 0 -type f
/opt/shell/tomcat-6.0.37/logs/catalina.out
/opt/shell/tomcat-6.0.37/logs/runninglog/visit/warn.log.1
/opt/shell/tomcat-6.0.37/logs/runninglog/visit/warn.log
?
2)最近48~24小时内修改的文件
[sam@strong logs]$ find ./ -maxdepth 1 -mtime 1 -type f
./manager.2014-04-11.log
./catalina.2014-04-11.log
./host-manager.2014-04-11.log
./localhost.2014-04-11.log
?
3)最新的5个文件
[sam@strong shelltest]$ ls -tr /opt/shell/tomcat-6.0.37/logs/|tail -n 5
localhost.2014-04-11.log
catalina.2014-04-11.log
a2014-02-20.log$
ba2014-02-20.log.sdf
catalina.out
?
说明:
-mtime:最近第n个24小时内修改过的文件,0表示最近24小时内修改过的文件,1表示最近48~24小时内修改过的文件,以此类推
-maxdepth:指定查询目录的层级,1表示仅查找指定目录下的文件,不查询子目录,2表示查询指定目录及下一级目录,以此类推
-type:指定过滤文件类型,f表示普通文件
ls -tr:t表示按时间排序,一般默认为降序排序,r表示反序,所以最后文件的显示顺序为按时间升序显示
tail -n 5:表示只显示最后5行记录 ,不带参数时,默认显示前10行
?
2、按文件大小查找文件
1)从当前目录查找最大的3个文件
[sam@strong logs]$ ls -S|head -n 3
catalina.out
catalina.tar.gz
catalina.out.20140227
?
2)从当前目录查找最大的9个文件
[sam@strong logs]$ ls -lS|head
总计 95068
-rw-rw-r-- 1 sam sam 73159998 04-12 23:41 catalina.out
-rw-rw-r-- 1 sam sam 9300994 02-13 15:40 catalina.tar.gz
-rw-rw-r-- 1 sam sam 4234391 02-27 11:14 catalina.out.20140227
-rw-rw-r-- 1 sam sam 4054370 03-24 16:25 catalina.2014-03-24.log
-rw-rw-r-- 1 sam sam 1923550 03-28 14:23 catalina.out.tar.gz
-rw-rw-r-- 1 sam sam 568196 02-27 17:57 catalina.2014-02-27.log
-rw-rw-r-- 1 sam sam 517827 03-21 14:51 catalina.2014-03-21.log
-rw-rw-r-- 1 sam sam 421855 03-05 18:25 catalina.2014-03-05.log
-rw-rw-r-- 1 sam sam 352904 02-28 17:08 catalina.2014-02-28.log
?
说明:
-S:表示按文件大小排序,一般默认为降序排序
head:不带参数时,默认显示前10行
?
3、按文件名称查找文件
1)查找当前目录中以2014-02-20.log为后缀的文件
只显示文件名
[sam@strong logs]$ ls|grep 2014-02-20.log$
host-manager.2014-02-20.log
localhost.2014-02-20.log
manager.2014-02-20.log
?
显示文件绝对路径
[sam@strong logs]$ ls|grep 2014-02-20.log$|sed "s:^:`pwd`/:"
/opt/shell/tomcat-6.0.37/logs/host-manager.2014-02-20.log
/opt/shell/tomcat-6.0.37/logs/localhost.2014-02-20.log
/opt/shell/tomcat-6.0.37/logs/manager.2014-02-20.log
?
说明:
其中用到了两个正则表达式的关键字
^ 表示一行的开头。sed "s:^:`pwd`/:",表示在行头插入`pwd`/,`pwd`会转换为在当前目录执行pwd命令的结果
$ 表示一行的结尾。grep 2014-02-20.log$,表示过滤出以2014-02-20.log为后缀的文件
?
2)在shelltest目录中查找查找以f开头,以.sh结尾的文件
[sam@strong ~]$ find shelltest/ -name f\* .sh
shelltest/func.sh
shelltest/forwhileuntilcase.sh
?
4、按文件内容查找文件
查找当前目录中,出现字符串then的文件
[sam@strong shelltest]$ ls -l|grep ^[^d]|awk 'NR!=1 {print $8}'|xargs grep then
compute.sh:if [ $x = $y ]; then
compute.sh:then
compute.sh: