在实际应用中,我们经常会遇到各种查找文件的需求,比如:
查找最新的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:if [ -f hello.sh ]; then
forwhileuntilcase.sh:echo "Hit a key, then hit return."
inoutput.sh:then
[sam@strong shelltest]$ ls -l|grep ^[^d]|awk 'NR!=1 {print $8}'|xargs grep then|awk -F: '{print $1}'|uniq
compute.sh
forwhileuntilcase.sh
inoutput.sh
[sam@strong shelltest]$ ls --file-type|grep -v /$|xargs grep then
compute.sh:if [ $x = $y ]; then
compute.sh:then
compute.sh:if [ -f hello.sh ]; then
forwhileuntilcase.sh:echo "Hit a key, then hit return."
inoutput.sh:then
[sam@strong shelltest]$ ls --file-type|grep -v /$|xargs grep then|awk 'BEGIN{FS=":"} {print $1}'|uniq
compute.sh
forwhileuntilcase.sh
inoutput.sh
说明:
以上两种方式的主要区别在于如何过滤掉目录,因为我们要查找的是文件。事实上,即使不过滤目录,查找的结果也是一致的。
ls -l之后,每行的第一个字母代表文件类型,d表示目录,正则表达式^[^d]表示只处理以非d开头的行
ls --file-type:执行之后目录会以/结尾,grep -v /$:忽略以/结尾的目录
awk 'NR!=1 {print $8}':NR!=1表示忽略第1行(因为执行ls -l之后,第1行显示多了一个总计信息),{print $8}表示打印出第8列(即文件名,英文环境ls -l之后可能文件名是第9列)
awk -F: '{print $1}':-F:表示以:为分隔符(作用与BEGIN{FS=":"}相同),awk默认以空字符串为分隔符
xargs:从管道或标准输入读取数据,该数据可以作为后续命令的参数进行执行
uniq:重复的文件名只显示1个(此处不需要先进行sort排序,因为重复的文件名都是紧挨在一起的,相当于已经按文件名排好序了)
5、分组查找文件
假设有以下文件,查找出文件名以时间结尾的各类文件的最新一个文件
[sam@strong diffiles]$ ls -l
总计 0
-rw-rw-r-- 1 sam sam 0 04-13 00:14 a_sub_20140410213155
-rw-rw-r-- 1 sam sam 0 04-13 00:14 a_sub_20140411100530
-rw-rw-r-- 1 sam sam 0 04-13 00:14 a_sub_20140412123011
-rw-rw-r-- 1 sam sam 0 04-13 00:14 b_sub_20140410213155
-rw-rw-r-- 1 sam sam 0 04-13 00:14 b_sub_20140411100530
-rw-rw-r-- 1 sam sam 0 04-13 00:14 b_sub_20140412123011
-rw-rw-r-- 1 sam sam 0 04-13 00:14 c_sub_20140410213155
-rw-rw-r-- 1 sam sam 0 04-13 00:14 c_sub_20140411100530
-rw-rw-r-- 1 sam sam 0 04-13 00:14 c_sub_20140412123011
-rw-rw-r-- 1 sam sam 0 04-13 00:17 notme
[sam@strong diffiles]$ ls -l|awk '{print $8}'|grep _sub_|awk -F_sub_ '{if (!filename[$1] || filename[$1]<$2) filename[$1]=$2;} END{for (i in filename) printf "%s_sub_%s\n",i,filename[i]}'
a_sub_20140412123011
b_sub_20140412123011
c_sub_20140412123011
说明:
-F_sub_:以_sub_为分隔符,将文件名前后分为3部分
{if (!filename[$1] || filename[$1]<$2) filename[$1]=$2;}:使用数据,以文件名前缀为下标,时间为值,每次处理时保存同类文件的最大时间
END{for (i in filename) printf "%s_sub_%s\n",i,filename[i]}:遍历分组后的数组,打印出文件名
最后,关于ls -l第一行的总计信息
假设当前目录如下
[sam@strong test]$ pwd
/home/sam/test
使用df命令查看目标文件所在的文件系统
[root@strong ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00 28G 8.1G 18G 32% /
/dev/vda1 99M 13M 82M 14% /boot
tmpfs 7.9G 0 7.9G 0% /dev/shm
则对应文件系统为:/dev/mapper/VolGroup00-LogVol00
使用root用户查看块大小
[root@strong ~]# tune2fs -l /dev/mapper/VolGroup00-LogVol00 | grep "Block size"
Block size: 4096
ls -l查看总计信息
[nagios@strong test]$ ls -l
total 52
-rw-rw-r-- 1 sam sam 1723 Apr 12 23:27 local_lat.java
-rw-rw-r-- 1 sam sam 2278 Apr 12 23:27 local_thr.java
-rw-rw-r-- 1 sam sam 10113 Apr 12 23:27 Makefile
-rw-rw-r-- 1 sam sam 512 Apr 12 23:27 Makefile.am
-rw-rw-r-- 1 sam sam 9912 Apr 12 23:27 Makefile.in
-rw-rw-r-- 1 sam sam 1853 Apr 12 23:27 remote_lat.class
-rw-rw-r-- 1 sam sam 2049 Apr 12 23:27 remote_lat.java
-rw-rw-r-- 1 sam sam 1224 Apr 12 23:27 remote_thr.class
-rw-rw-r-- 1 sam sam 1722 Apr 12 23:27 remote_thr.java
因为块大小为4096bytes,即4k,Linux分配空间的时候,会以4096的整数倍为文件或目录进行分配,那么上面的计算公式为:
(1+1+3+1+3+1+1+1+1)*4=52K
好了,就这么多吧,如果大家还有其他使用场景或建议,欢迎共同探讨!
(转载请注明来源:http://zhanjia.iteye.com/admin/blogs/2044251)
awk、sed参考资料:
相关推荐
在Linux操作系统中,掌握查找文件的方法对于日常管理和维护工作至关重要。本文将详细介绍两个常用的命令:whereis和find,以及它们的使用技巧。 首先,`whereis`命令主要用于查找命令文件、源代码和man帮助文件。它...
Linux 下使用 find 命令根据系统时间查找文件用法 Linux 下的 find 命令是一个功能强大且灵活的工具,用于查找文件和目录。其中一个重要的应用场景是根据系统时间查找文件。系统时间是指文件的最后修改时间、最后...
在Linux操作系统中,遍历目录查找特定后辍的文件是一项常用的任务,这主要涉及到命令行工具的使用,尤其是`find`命令。`find`命令是Linux系统中强大的文件搜索工具,能够帮助用户按照不同的条件在文件系统中寻找指定...
Linux下的文件查找类命令 Linux 操作系统中,文件查找类命令是系统管理员不可或缺的基本技能之...Linux 下的文件查找类命令各有其特点和应用场景,了解每个命令的用法和特点可以帮助系统管理员更好地管理 Linux 系统。
在Windows中,我们通常通过双击文件来打开并查看内容,但在Linux环境下,我们需要借助命令行工具来实现这一目的。这里主要介绍两个常用的命令:`cat` 和 `less`。 首先,`cat`(concatenate)命令是最基本的查看...
### Linux中的文件查找技术——详解find命令 #### 一、引言 在Linux系统中,文件查找是一项极为常见的操作需求。对于系统管理员或是开发者而言,能够高效地定位到特定文件至关重要。本文将全面介绍`find`命令的...
在Linux系统中,Redis是一个广泛使用的高性能键值存储系统,常用于数据库、缓存和消息代理等场景。本文将详细讲解如何在Linux环境下安装Redis,以及如何配置主服务器和从服务器。 首先,让我们从安装Redis开始。在...
【Linux 下位图文件系统的设计与实现】 在 Linux 操作系统中,文件系统扮演着至关重要的角色,它负责管理和组织存储设备上的数据。随着 Linux 的不断发展和完善,用户可以通过虚拟文件系统(VFS)来实现自定义的...
其中,`find` 命令作为文件查找工具中的佼佼者,被广泛应用于各种场景中。本篇文章将深入探讨 `find` 命令的基本用法、常用选项以及实际应用案例。 #### 一、`find` 命令概述 `find` 命令用于在指定目录树下查找...
**find** 命令是Linux系统中用于在指定目录树下查找文件的强大工具。它可以基于多种条件(如文件名、文件大小、所有者、组、是否为空、访问时间、修改时间等)来搜索文件。 ##### 1. 基本格式 ```bash find path ...
"使用线程动态遍历查找文件变化"这一主题,旨在教你如何通过编程技术实时监测文件或目录的变动,如新建、修改、删除等事件。这个过程通常涉及到多线程技术,以便在不影响主程序运行的情况下,实时获取文件系统的最新...
### Linux基础命令与系统管理详解 ...- **find**:查找文件。 这些命令是Linux系统中最常用的工具之一,掌握它们对于有效管理和维护Linux系统至关重要。通过不断地实践和学习,用户可以更加熟练地使用Linux操作系统。
### Linux查找日志技巧详解 #### 一、引言 在Linux系统中,日志文件是维护和诊断问题的重要工具之一。通过对日志文件的有效管理与检索,可以帮助系统管理员快速定位问题并解决故障。本文将详细介绍Linux环境下常用...
在深入探讨如何在Linux下挂载使用NTFS文件系统之前,我们先来了解一些基础知识。...通过上述步骤,你可以在Linux环境下顺利挂载并使用NTFS文件系统,实现跨平台的数据共享和操作,极大地扩展了Linux的使用场景和能力。
本文详细介绍了如何在Linux环境中查询并删除文件的方法,包括基本命令的使用方法、高级技巧以及实际应用场景。通过学习这些知识,可以帮助用户更高效地管理和维护Linux系统中的文件资源。希望本文能够为大家提供帮助...
这两个命令虽然都是用于查找文件,但其工作原理和适用场景有所不同。 首先,我们来了解`locate`命令。`locate`是基于数据库的文件查找工具,它通过预先建立的文件系统索引快速找到文件。在大多数Linux系统中,这个...
根据应用场景选择合适的文件系统。 8. 定期维护:使用`fsck`命令定期检查和修复文件系统错误,以保持其健康状态。 通过以上方法,我们可以有效地提高Linux文件系统的使用效率,延长其使用寿命,并确保系统的稳定性...
本文将深入探讨`lsof`命令的使用方法及其在不同场景下的应用。 ### 前言 在Linux环境下,一切资源都被抽象为文件,包括硬件设备、网络连接等。了解哪些进程正在使用哪些文件,可以帮助我们诊断系统问题、定位资源...
本篇将详细探讨如何在Linux环境下构建文件系统,设置权限,以及进行加载与卸载的操作。 一、构建特殊用途的文件系统 构建特殊用途的文件系统涉及到选择合适的文件系统类型,如ext4、XFS或Btrfs等。首先,你需要...