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

news2024/12/22 13:24:42

       之前研究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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot+vue的桂林旅游景点导游平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

3个精美的wordpress企业网站模板

WordPress企业网站模板 https://www.zhanyes.com/qiye/6305.html WordPress企业官网模板 https://www.zhanyes.com/qiye/6309.html WordPress律师模板 https://www.zhanyes.com/qiye/23.html

新代码质量评审标准与评分表格

前面发了一个《代码质量评审标准与评分表格》,是比较宽泛的,下面发一个更贴近具体场景的《新代码质量评审标准与评分表格》。 一、引言 本文档旨在为代码质量评审提供一个统一的标准和评分机制,以确保代码质量、可读性和可维护性。通过遵循这…

JAVA代码审计之XSS漏洞

Part1 漏洞案例demo&#xff1a; 没有java代码审计XSS漏洞拿赏金的案例。 所以将就看看demo吧 漏洞原理&#xff1a;关于XSS漏洞的漏洞原理核心其实没啥好说的&#xff0c;网上一查一大堆 反射性XSS漏洞 <% page language"java" contentType"text/html; c…

微服务远程调用Feign

目录 RPC概述 什么是Feign&#xff1f; Ribbon&Feign对比 Feign的设计架构 Spring Cloud Alibaba快速整合Feign Spring Cloud Feign扩展 日志配置 契约配置 通过拦截器实现参数传递 自定义拦截器实现认证逻辑 超时时间配置 RPC概述 微服务之间如何方便优雅的实…

【Linux进阶之路】Socket —— “UDP“ “TCP“

文章目录 一、再识网络1. 端口号2. 网络字节序列3.TCP 与 UDP 二、套接字1.sockaddr结构2.UDP1.server端1.1 构造函数1.2 Init1.3 Run 2.客户端1.Linux2.Windows 3.TCP1. 基本接口2. 客户端3. 服务端1.版本12.版本23.版本34.版本4 三、守护进程尾序 一、再识网络 1. 端口号 在…

给windows server安装nginx服务

一、先安装chocolatey https://chocolatey.org/install 二、查询nginx包 https://community.chocolatey.org/packages 三、安装nginx choco install nginx 四、通过命令行启动/关闭nginx net stop nginx net start nginx 我开发的chatgpt网站&#xff1a; https://chat.xut…

Unity中URP实现水效果(水的深度)

文章目录 前言一、搭建预备场景1、新建一个面片&#xff0c;使其倾斜一个角度&#xff0c;来模拟水底和岸边的效果2、随便创建几个物体&#xff0c;作为与水面接触的物体3、再新建一个面片&#xff0c;作为水面 二、开始编写水体的Shader效果1、新建一个URP基础Shader2、把水体…

【Java】类与对象(实验二)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 掌握类的定义与对象的创建。理解构造方法和this关键字的用法。掌握对象对于属性及方法的引用。 二、实验内容 1、编写一个Java程序&#xff0c;定义一个表示学生的类Student&#xff0c;该类包括: (1)这个类的…

C++力扣题目300--最长递增子序列 674--最长连续递增序列 718--最长重复子数组

300.最长递增子序列 力扣题目链接(opens new window) 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2…

深入理解flinksql执行流程,calcite与catalog相关概念,扩展解析器实现语法的扩展

深入理解Flink Sql执行流程 1 Flink SQL 解析引擎1.1SQL解析器1.2Calcite处理流程1.2.1 SQL 解析阶段&#xff08;SQL–>SqlNode&#xff09;1.2.2 SqlNode 验证&#xff08;SqlNode–>SqlNode&#xff09;1.2.3 语义分析&#xff08;SqlNode–>RelNode/RexNode&#…

R的seurat和python的scanpy对比学习

现在的单细胞分析&#xff0c;往往避免不了scanpy的使用&#xff0c;我们可以通过对比seurat来学习scanpy 今天的格式怎么都改不了。。。手机阅读有点费劲&#xff0c;&#xff0c;推荐电脑阅读。 单细胞数据分析概览 单细胞分析&#xff0c;总流程 python教程 seurat教程 se…

ubuntu20配置protobuf 2.5.0

python安装protobuf包 sudo pip2 install protobuf2.5.0github克隆获取安装包 wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz解压并进入该目录 tar -zxvf Protobuf-2.5.0.tar.gz cd protobuf-2.5.0配置安装环境 sudo …

HTB pwn Dragon Army

逆向分析 程序使用了alloca函数扩大了栈区 此处可以泄露libc的地址 程序主要功能在下面 while ( 1 ){while ( 1 ){fflush(stdin);fflush(_bss_start);fprintf(_bss_start, "\n%sDragons: [%d/%d]%s\n\n", "\x1B[1;34m", v5, 13LL, "\x1B[1;37m"…

【洛谷题解】B2118 验证子串

题目链接&#xff1a;验证子串 - 洛谷 题目难度&#xff1a;入门 涉及知识点&#xff1a;STL函数 题意&#xff1a; 分析&#xff1a;用一个STL内置的find函数 AC代码&#xff1a; #include<bits/stdc.h> /*find用法&#xff1a;string s1&#xff0c;s2;int as1.f…

crmeb多门店商城系统二次开发 增加车辆车牌搜索功能、车辆公里数

1、增加的数据库 ALTER TABLE eb_store_order ADD cart_number VARCHAR(255) NOT NULL DEFAULT COMMENT 车牌 AFTER erp_order_id, ADD curmileage VARCHAR(255) NOT NULL DEFAULT COMMENT 当前里程 AFTER cart_number; ALTER TABLE eb_store_cart ADD cart_number VARCHAR(…

容器_Docker ( 04 )

容器_Docker ( 03 ) 解密云原生 - 集群概述 kubernetes概述 kubernetes起源 如果想要将docker应用于具体的业务实现 , 是存在困难的 – 编排, 管理和调度等各个方面 , 都不容易.于是 , 人们迫切需要一套管理系统 , 对docker及容器进行更高级更灵活的管理 , 于是kubernetes出…

Kotlin filterIsInstance filterNotNull forEach

Kotlin filterIsInstance filterNotNull forEach fun main(args: Array<String>) {val i1 MyItem(1, 1)val i2: MyItem? nullval i3: Int 3val i4 "4"val i5 nullval i6 MyItem(6, 6)val list mutableListOf<Any?>(i1, i2, i3, i4, i5, i6)lis…

蓝牙耳机哪个品牌质量好?2024超高性能机型比拼推荐

​无线耳机已经成为现代生活中的必备数码产品&#xff0c;尤其在感受到无线带来的自由后&#xff0c;很难再适应有线耳机的束缚。因此&#xff0c;耳机市场竞争激烈&#xff0c;各种类型和外观的耳机层出不穷。在此&#xff0c;我为大家总结了五款使用体验很不错的蓝牙耳机&…

静态时序分析:SDC约束命令set_driving_cell详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在上文中&#xff0c;我们不建议使用set_drive命令而是使用set_driving_cell命令&#xff0c;这是一个描述输入端口驱动能力更精确的方法。因为大多数情况下&…