博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维码进入京东手机购书页面。 |
有时候,我们会向一个文件夹里添加或删除文件,随着文件越来越多,操作历史越来越长,最初文件夹的状态可能就记不清了,某些时候,我们可能想恢复到文件夹的初始状态,重新来过,这时候就只能依靠文件修改时间来查找和过滤文件了。一个典型的场景就是:为了运行各种组件,我们会往一个 lib 文件夹中添加各种 Jar 包,有时候,时间久了,Jar 包可能会出现版本冲突,于是我们想清理到近期安装的各种 Jar 包,从初始状态重新开始。
在介绍具体操作前,先补充一个 Linux 小知识,就是文件的三种时间属性:atime
,ctime
,mtime
:
简名 | 全名 | 中文 | 作用 |
---|---|---|---|
atime | Access Time | 访问时间 | 最后一次访问文件(读取或执行)的时间 |
ctime | Change Time | 变化时间 | 最后一次改变文件(属性或权限)或者目录(属性或权限)的时间 |
mtime | Modify Time | 修改时间 | 最后一次修改文件(内容)或者目录(内容)的时间 |
- 使用
stat
命令可以查看一个文件完整的atime
,ctime
,mtime
- 使用
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
,其中的 X
和 Y
是以下字母的一些组合,但是在不同系统上,允许的组合种类也是不一样的,总得来说, -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.