Shell 脚本:按日期排序和查找文件 / 删除指定时间范围内的文件

《大数据平台架构与原型实现:数据中台建设实战》博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维码进入京东手机购书页面。

有时候,我们会向一个文件夹里添加或删除文件,随着文件越来越多,操作历史越来越长,最初文件夹的状态可能就记不清了,某些时候,我们可能想恢复到文件夹的初始状态,重新来过,这时候就只能依靠文件修改时间来查找和过滤文件了。一个典型的场景就是:为了运行各种组件,我们会往一个 lib 文件夹中添加各种 Jar 包,有时候,时间久了,Jar 包可能会出现版本冲突,于是我们想清理到近期安装的各种 Jar 包,从初始状态重新开始。

在介绍具体操作前,先补充一个 Linux 小知识,就是文件的三种时间属性:atimectimemtime:

简名全名中文作用
atimeAccess Time访问时间最后一次访问文件(读取或执行)的时间
ctimeChange Time变化时间最后一次改变文件(属性或权限)或者目录(属性或权限)的时间
mtimeModify Time修改时间最后一次修改文件(内容)或者目录(内容)的时间
  • 使用 stat 命令可以查看一个文件完整的atimectimemtime
  • 使用 ls -al 命令查看文件时显示的是文件的 mtime
  • 使用 ls -al --time=ctime 命令查看文件时显示的是文件的 ctime
  • 使用 ls -alt --time=ctime 命令查看文件时显示的是文件的 ctime,同时按 ctime 降序排列
  • 使用 ls -altr --time=ctime 命令查看文件时显示的是文件的 ctime,同时按 ctime 升序排列
  • 使用 ls -al --time=atime 命令查看文件时显示的是文件的 atime
  • 使用 ls -alt --time=atime 命令查看文件时显示的是文件的 atime,同时按 atime 降序排列
  • 使用 ls -al --time=atime 命令查看文件时显示的是文件的 atime,同时按 atime 升序排列

我们应该根据场景确定查找和筛选文件是使用 ctime 还是 mtime,如果是你会去编辑的文件,那么,应该使用 mtime,如果只是单纯的使用这些文件,不会改动任何内容(但有可能会修改过文件属性,owner, r/w 等),那么,应该使用 ctime。本文我们举例的场景是操纵 Jar 包,这些 Jar 文件是不会被改动内容的,所以后面的操作我们将以 mtime 为准!以下是一个完整的操作过程:

1. 首先查看一下所有文件的修改时间

# 按文件修改时间(mtime) 降序排列
ls -alt --time-style="+%F %T"

如果单纯用修改时间查看不能提供清晰的判断,可以再辅助变化时间来加以佐证:

# 按文件变化时间(ctime) 降序排列
ls -alt --time=ctime --time-style="+%F %T"

2. 找出给定时间点之后修改过的文件

基于 ls 命令输出的文件列表,我们可以判断出是在什么时间点开始在当前目录下添加 Jar 包的,我们以 2024-01-01 为例,如果我们想找出 2024-01-01 之后所有修改、添加过的文件,应该使用如下命令:

# 查找在这个时间点之后修改过的文件
find . -maxdepth 1 -type f -newermt '2024-01-01'

如果想删除这些文件,使用命令:

find . -maxdepth 1 -type f -newermt '2024-01-01' -delete

3. 找出给定时间点之前修改过的文件

基于 ls 命令输出的文件列表,我们可以判断出是在什么时间点开始在当前目录下添加 Jar 包的,我们以 2024-01-01 为例,如果我们想找出 2024-01-01 之前所有修改、添加过的文件,应该使用如下命令:

# 查找在这个时间点之前修改过的文件
find . -maxdepth 1 -type f \! -newermt '2024-01-01'

如果想删除这些文件,使用命令:

find . -maxdepth 1 -type f \! -newermt '2024-01-01' -delete

4. 找出给定时间范围内修改过的文件

基于 ls 命令输出的文件列表,我们可以精准地删除指定时间范围内的文件,2024年整个1月份为例,

find . -maxdepth 1 -type f -newermt '2024-01-01' \! -newermt '2024-02-01'

注意:是闭开区间[2024-01-01 00:00:00, 2024-02-01 00:00:00),不含 2024-02-01 00:00:00,是完整的一个月!

如果想删除这些文件,使用命令:

find . -maxdepth 1 -type f -newermt '2024-01-01' \! -newermt '2024-02-01' -delete

补充知识:

关于 find 命令的 -newermt 这个参数,其格式其实是 -newerXY,其中的 XY 是以下字母的一些组合,但是在不同系统上,允许的组合种类也是不一样的,总得来说, -newermt 指的是:文件修改时间早于给定的时间。以下是 find 命令文档对该参数的说明 :

-newer file
       File was modified more recently than file.  If file is a symbolic link and the -H option or the -L option is in effect, the modification time of the file it points to is always used.

-newerXY reference
       Compares the timestamp of the current file with reference.  The reference argument is normally the name of a file (and one of its timestamps is used for the comparison) but it may also be a  string  describing
       an absolute time.  X and Y are placeholders for other letters, and these letters select which time belonging to how reference is used for the comparison.

       a   The access time of the file reference
       B   The birth time of the file reference
       c   The inode status change time of reference
       m   The modification time of the file reference
       t   reference is interpreted directly as a time

       Some combinations are invalid; for example, it is invalid for X to be t.  Some combinations are not implemented on all systems; for example B is not supported on all systems.  If an invalid or unsupported com‐
       bination of XY is specified, a fatal error results.  Time specifications are interpreted as for the argument to the -d option of GNU date.  If you try to use the birth time of a reference file, and  the  birth
       time cannot be determined, a fatal error message results.  If you specify a test which refers to the birth time of files being examined, this test will fail for any files where the birth time is unknown.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laurence 

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值