Linux中的各类时间 与 find命令的常用参数

       之前研究wal日志清理的副产物,wal日志名被修改后文件的哪个时间会变?应该如何删除?由此整理一下Linux中atime、mtime、ctime的区别,以及find的常见用法。

一、 Linux中的各类时间

1. 各类时间的定义

Linux中有三种用于文件时间戳的概念:

  • atime(访问时间):表示文件最后一次被读取的时间。每次对文件的读取都会更新atime。这意味着即使只是查看文件的内容,atime也会被更新。在许多情况下,特别是对于大量读取操作的文件系统,会关闭或限制atime更新以提高性能。

  • mtime(修改时间):表示文件内容最后一次被修改的时间。当文件的内容发生变化时,mtime会被更新。这包括文件的写入、追加、截断等操作。

  • ctime(更改时间):表示文件元数据(比如权限、所有者、链接数等)最后一次被修改的时间。当文件的元数据发生变化时,ctime会被更新。这包括文件的文件名、权限、链接数、所有者变更等操作。

2. 如何查看这些时间

① stat命令
-bash-4.2$ stat tmp.html 
  File: ‘tmp.html’
  Size: 31284     	Blocks: 64         IO Block: 4096   regular file
Device: f900h/63744d	Inode: 67752138    Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/postgres)   Gid: (  502/     dba)
Access: 2023-04-05 14:25:13.759000000 +0800
Modify: 2023-04-05 14:24:52.767000000 +0800
Change: 2023-04-05 14:24:52.767000000 +0800

       通常来说,mtime变化ctime都会跟着变,因为修改文件内容后,其大小等元数据都会变化。如果直接echo修改文件,atime不会变;如果通过vi等方式直接访问文件修改,则atime会变。

-bash-4.2$ echo "111" >> tmp.html
-bash-4.2$ 
-bash-4.2$ stat tmp.html 
  File: ‘tmp.html’
  Size: 31288     	Blocks: 64         IO Block: 4096   regular file
Device: f900h/63744d	Inode: 67752138    Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/postgres)   Gid: (  502/     dba)
Access: 2023-04-05 14:25:13.759000000 +0800
Modify: 2024-02-22 15:39:44.592000000 +0800
Change: 2024-02-22 15:39:44.592000000 +0800
-bash-4.2$ vi tmp.html 
-bash-4.2$ 
-bash-4.2$ stat tmp.html 
  File: ‘tmp.html’
  Size: 31284     	Blocks: 64         IO Block: 4096   regular file
Device: f900h/63744d	Inode: 69354682    Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/postgres)   Gid: (  502/     dba)
Access: 2024-02-22 15:40:22.778000000 +0800
Modify: 2024-02-22 15:40:22.778000000 +0800
Change: 2024-02-22 15:40:22.780000000 +0800
 Birth: -

       修改元数据,例如文件名,ctime会变mtime不变。

-bash-4.2$ mv tmp.html tmp_02.html
-bash-4.2$ 
-bash-4.2$ stat tmp_02.html 
  File: ‘tmp_02.html’
  Size: 31284     	Blocks: 64         IO Block: 4096   regular file
Device: f900h/63744d	Inode: 69354682    Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/postgres)   Gid: (  502/     dba)
Access: 2024-02-22 15:40:22.778000000 +0800
Modify: 2024-02-22 15:40:22.778000000 +0800
Change: 2024-02-22 15:49:19.370000000 +0800
 Birth: -

      访问一下文件,只有atime会变

-bash-4.2$ less tmp_02.html
-bash-4.2$ 
-bash-4.2$ stat tmp_02.html 
  File: ‘tmp_02.html’
  Size: 31284     	Blocks: 64         IO Block: 4096   regular file
Device: f900h/63744d	Inode: 69354682    Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/postgres)   Gid: (  502/     dba)
Access: 2024-02-22 15:52:46.589000000 +0800
Modify: 2024-02-22 15:40:22.778000000 +0800
Change: 2024-02-22 15:49:19.370000000 +0800
 Birth: -

② ls命令

ls命令利用不同的参数可以看到不同的时间

  • mtime:ls -l filename
  • atime:ls -lu filename
  • ctime:ls -lc filename
-bash-4.2$ ls -l tmp_02.html 
-rw-r--r-- 1 postgres dba 31284 Feb 22 15:40 tmp_02.html
-bash-4.2$ 
-bash-4.2$ ls -lu tmp_02.html 
-rw-r--r-- 1 postgres dba 31284 Feb 22 15:52 tmp_02.html
-bash-4.2$ 
-bash-4.2$ ls -lc tmp_02.html 
-rw-r--r-- 1 postgres dba 31284 Feb 22 15:49 tmp_02.html

这里默认只到分钟,更详细的可以用time-style参数调整显示格式

-bash-4.2$ ls -l tmp_02.html --time-style=+"%Y-%m-%d %H:%M:%S"
-rw-r--r-- 1 postgres dba 31284 2024-02-22 15:40:22 tmp_02.html
-bash-4.2$ 
-bash-4.2$ ls -lu tmp_02.html --time-style=+"%Y-%m-%d %H:%M:%S"
-rw-r--r-- 1 postgres dba 31284 2024-02-22 15:52:46 tmp_02.html
-bash-4.2$ 
-bash-4.2$ ls -lc tmp_02.html --time-style=+"%Y-%m-%d %H:%M:%S"
-rw-r--r-- 1 postgres dba 31284 2024-02-22 15:49:19 tmp_02.html

3. wal日志应该用哪个时间判断删除

       以实际的wal日志为例,可以看到被重命名后仅ctime会改变。一段时间后其文件内容也被修改,mtime和ctime同时变化。因此,为了避免误删除,用ctime来作为条件相对而言是最安全的,也可以mtime和ctime两个条件都加上。

二、 find命令的常用参数

1. 按时间查找

就是前面提到过的3个时间

  • -atime n:查找在 n*24小时(前/内/时)被访问过的文件
  • -ctime n:查找在 n*24小时(前/内/时)元数据被修改的文件
  • -mtime n:查找在 n*24小时(前/内/时)内容被修改过的文件

还可以按分钟

  • -amin n:查找在 n分钟(前/内/时)被访问过的文件
  • -cmin n:查找在 n分钟(前/内/时)元数据被修改的文件
  • -mmin n:查找在 n分钟(前/内/时)内容被修改过的文件

这个 n 前面可以带 + - 或者不带符号,例如:

  • -mtime -5:[5*24小时前时间点,当前时间点)
  • -mtime 5:[6*24小时前时间点,5*24小时前时间点]
  • -mtime +5: (−∞,5*24小时前时间点),特别注意这里是开区间

之所以特地强调24小时,因为它不是从0:00算起,而是按执行命令那刻的时间计算。

测试验证

[root@linux01 ~]# touch -t 02231400 2024-0223-1400
[root@linux01 ~]# touch -t 02221400 2024-0222-1400
[root@linux01 ~]# touch -t 02211400 2024-0221-1400
[root@linux01 ~]# touch -t 02201400 2024-0220-1400
[root@linux01 ~]# touch -t 02191400 2024-0219-1400
[root@linux01 ~]# touch -t 02181400 2024-0218-1400
[root@linux01 ~]# touch -t 02171400 2024-0217-1400
[root@linux01 ~]# touch -t 02161400 2024-0216-1400

[root@linux01 ~]# ll -h 2024*
-rw-r--r-- 1 root root 0 Feb 16 14:00 2024-0216-1400
-rw-r--r-- 1 root root 0 Feb 17 14:00 2024-0217-1400
-rw-r--r-- 1 root root 0 Feb 18 14:00 2024-0218-1400
-rw-r--r-- 1 root root 0 Feb 19 14:00 2024-0219-1400
-rw-r--r-- 1 root root 0 Feb 20 14:00 2024-0220-1400
-rw-r--r-- 1 root root 0 Feb 21 14:00 2024-0221-1400
-rw-r--r-- 1 root root 0 Feb 22 14:00 2024-0222-1400
-rw-r--r-- 1 root root 0 Feb 23 14:00 2024-0223-1400
[root@linux01 ~]# date
Fri Feb 23 14:32:10 CST 2024

[root@linux01 ~]# find . -mtime -5 -name "2024*"
./2024-0223-1400
./2024-0222-1400
./2024-0221-1400
./2024-0220-1400
./2024-0219-1400
[root@linux01 ~]# 
[root@linux01 ~]# find . -mtime 5 -name "2024*"
./2024-0218-1400
[root@linux01 ~]# 
[root@linux01 ~]# find . -mtime +5 -name "2024*"
./2024-0217-1400
./2024-0216-1400

2. 目录深度

       默认情况下,find会查找指定目录下的所有子目录,但有时我们只需要它在当前目录下查找,就可以利用maxdepth进行限制,提高效率的同时避免误删子目录的文件。相应的还有一个mindepth参数,有需要可以配合使用。

① 默认情况

可以看到它还查了archive_status目录下的文件

-bash-4.2$ ls
00000004.history                          000000050000000900000000  000000050000000900000002  archive_status
000000050000000100000058.00000028.backup  000000050000000900000001  00000005.history

-bash-4.2$ find .
.
./archive_status
./archive_status/00000004.history.done
./archive_status/00000005.history.done
./archive_status/000000050000000900000000.done
./archive_status/000000050000000900000001.done
./archive_status/000000050000000100000058.00000028.backup.done
./00000004.history
./000000050000000100000058.00000028.backup
./00000005.history
./000000050000000900000000
./000000050000000900000001
./000000050000000900000002

② 仅查当前目录 -- maxdepth=1

这次结果就不包含archive_status目录下的文件

-bash-4.2$ find . -maxdepth 1
.
./archive_status
./00000004.history
./000000050000000100000058.00000028.backup
./00000005.history
./000000050000000900000000
./000000050000000900000001
./000000050000000900000002

③ maxdepth=0的效果

       maxdepth=0是一个特别的设置(一般不用),它表示仅在命令行给定的文件列表中去查询,如果不给,返回结果均为空。

-bash-4.2$ find . -maxdepth 0
.

命令行中给定文件列表,它只会在给定的000和001两个文件中去查询

-bash-4.2$ find . 000000050000000900000000 000000050000000900000001 -maxdepth 0
.
000000050000000900000000
000000050000000900000001
-bash-4.2$ 
-bash-4.2$ find . 000000050000000900000000 000000050000000900000001 -maxdepth 0 -name "000000050000000900000000"
000000050000000900000000

3. 执行命令 exec与xargs

① find与管道的冲突

查找文件通常是为了对它们进行操作,一般这步会用管道来实现,但在find中是不行的。

例如下面本来只想列出查找后的文件信息,实际上ll -h列出了当前目录所有文件。

[root@linux01 ~]# find . -mtime +5 -name "2024*" | ll -h
total 15M
-rw-r--r--  1 root     root     0 Feb 16 14:00 2024-0216-1400
-rw-r--r--  1 root     root     0 Feb 17 14:00 2024-0217-1400
-rw-r--r--  1 root     root     0 Feb 18 14:00 2024-0218-1400
-rw-r--r--  1 root     root     0 Feb 19 14:00 2024-0219-1400
-rw-r--r--  1 root     root     0 Feb 20 14:00 2024-0220-1400
-rw-r--r--  1 root     root     0 Feb 21 14:00 2024-0221-1400
-rw-r--r--  1 root     root     0 Feb 22 14:00 2024-0222-1400
-rw-r--r--  1 root     root     0 Feb 23 14:00 2024-0223-1400
-rw-------. 1 root     root  1.5K Jul 11  2022 anaconda-ks.cfg
-rw-r--r--  1 root     root   493 Oct 12 02:29 date.txt
-rwxr-xr-x  1 root     root   123 Nov 26  2022 function.c

       首先什么是管道,即前一个程序的 标准输出 作为后一个程序的标准输入。

       因为find命令生成的是一个文件列表,它可能包括文件路径、文件名等信息,而不是纯文本内容。因此,如果要对find命令的输出进行进一步处理,需要使用-exec参数或者xargs命令来实现。

参考:

ctime、mtime、atime-阿里云开发者社区

Linux find 命令 | 菜鸟教程

【Linux】find コマンド【図解】 | 100%レンタルサーバーを使いこなすサイト

find -maxdepth 0 not returning me any output - Unix & Linux Stack Exchange

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/404745.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

你听说过柔性数组吗?

目录 1. 柔性数组的概念 2. 柔性数组的特点 3. 柔性数组的使用 4. 柔性数组的优势 5.完结散花 悟已往之不谏,知来者犹可追 创作不易,宝子们!如果这篇文章对你们有帮助的话&#…

个人博客系列-项目部署-nginx(3)

使用Nginx uwsgi进行部署django项目 一. 检查项目是否可以运行 启动项目 python manage.py runserver 0.0.0.0:8099输入ip:8099 查看启动页面 出现上述页面表示运行成功 二. 安装uwsgi并配置 2.1 下载uwsgi pip install uwsgi新建文件test.py写入内容,测试一…

【操作系统】磁盘文件管理系统

实验六 磁盘文件管理的模拟实现 实验目的 文件系统是操作系统中用来存储和管理信息的机构,具有按名存取的功能,不仅能方便用户对信息的使用,也有效提高了信息的安全性。本实验模拟文件系统的目录结构,并在此基础上实现文件的各种…

【前端素材】推荐优质后台管理系统Spica Admin平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具,它通常作为一个独立的后台界面存在,供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能: 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

会话技术之cookie和session

COOKIE 什么是COOKIE? Cookie是由网站存储在用户计算机上的小型文本文件,用于在用户访问网站时跟踪和识别用户。Cookie可以在用户的计算机上存储有关用户行为和偏好的信息,以便在用户下次访问相同网站时提供个性化的体验。以下是一些关于Cookie的重要…

C语言——指针——第2篇——(第20篇)

坚持就是胜利 文章目录 一、指针和数组二、二级指针1、什么是 二级指针?2、二级指针 解引用 三、指针数组模拟二维数组 一、指针和数组 问(1):指针和数组之间是什么关系呢? 答:指针变量就是指针变量&…

【Linux】一站式教会:Ubuntu(无UI界面)使用apache-jmeter进行压测

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、Java…

C++:string类

标准库中的string类 string类 1. 字符串是表示字符序列的类 2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。 3. string类是使用char(即作为它的字符类型,使用…

统计图曲线图绘制方法

统计图曲线图绘制方法 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制,饼图环形图绘制较难。 曲线图的曲线绘制较难,今提供曲线图的绘制方法供参考。 本方法采用C语言的最基本功能: &#xff…

【C++】——模板初阶 | STL简介

前言: 模板初阶 | STL简介 文章目录 一、模板初阶1.1 函数模板1.2 类模板 二、STL简介 (了解) 一、模板初阶 泛式编程(Generic Programming)指的是一种编程范式,其核心思想是编写可以在不同数据类型上通用的代码&#…

Linux系列讲解 —— 【Vim编辑器】在Ubuntu18.04中安装新版Vim

平时用的电脑系统是Ubuntu18.04,使用apt安装VIM的默认版本是8.0。如果想要安装新版的Vim编辑器,只能下载Vim源码后进行编译安装。 目录 1. 下载Vim源码2. 编译3. 安装4. 遇到的问题4.1 打开vim后,文本开头有乱码现象。4.2 在Vim编辑器中&…

通信入门系列——锁相环、平方环、Costas环

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、锁相环 1、压控振荡…

精酿啤酒:麦芽与啤酒花搭配的奥秘

麦芽和啤酒花是啤酒酿造过程中不可或缺的原料,它们的风味和特点对啤酒的口感和品质产生着深远的影响。Fendi Club啤酒在麦芽与啤酒花的搭配方面有着与众不同的技巧和见解,让啤酒的口感更加丰富和迷人。 首先,麦芽的选择是啤酒酿造的关键之一。…

C语言特殊函数

静态函数 背景知识:普通函数都是跨文件可见的,即在文件 a.c 中定义的函数可以在 b.c 中使用。 静态函数:只能在定义的文件内可见的函数,称为静态函数。 语法 staitc void f(void) // 在函数头前面增加关键字 static &#xff…

2024.2.22 C++QT 作业

思维导图 练习题 1>完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面。如果账…

2024年开发者的最好选择!!没有之一

中国银河证券1月23日明确指出:鸿蒙应用将在2024年迎来爆发。 2024年Q2推出开发者Beta版,2024年Q4推出商用版。今年年终将有 5000 款应用完成原生鸿蒙开发,未来支持 50 万款应用。覆盖便捷生活、出行文旅、金融便利、社交资讯、生产力工具、影…

Stable Diffusion 3 Early Preview发布

2月22日,Stability AI 发布了 Stable Diffusion 3 early preview,这是一种开放权重的下一代图像合成模型。据报道,它继承了其前身,生成了详细的多主题图像,并提高了文本生成的质量和准确性。这一简短的公告并未附带公开…

节假日效应prophet预测模型和节假日识别错误

节假日效应是指在特定的节假日或纪念日期间,人们的行为和活动发生变化,从而影响到相应的时间序列数据(股票或者其他)。这种效应可能在多个领域产生影响,包括销售、交通、能源消耗等。 完整代码和数据可关注gzh’financ…

[算法沉淀记录] 排序算法 —— 归并排序

排序算法 —— 归并排序 算法介绍 归并排序是一种分治算法,由约翰冯诺伊曼在1945年发明。它的工作原理是将未排序的列表划分为n个子列表,每个子列表包含一个元素(包含一个元素的列表被认为是有序的),然后重复合并子列表以生成新的有序子列表…

最简单方式把jar打包成Windows服务

废话 😢 将JAR文件转化为Windows服务是一种高效且常见的Java应用部署策略。这种转变赋予了Java应用程序在Windows操作系统上以无界面后台服务模式运行的能力,从而实现了持续、稳定且可靠的功能提供。这种部署方式不仅提升了应用的可用性&#xff0c…