`

Linux下文件的三种时间标记:访问时间、修改时间、状态改动时间

阅读更多

在windows下,一个文件有:创建时间、修改时间、访问时间。
在Linux下,一个文件也有三种时间,分别是:访问时间、修改时间、状态改动时间

两者有此不同,在Linux下没有创建时间的概念,也就 是不能知道文件的建立时间,但如果文件建立后就没有修改过,修改时间=建立时间;如果文件建立后,状态就没有改动过,那么状态改动时间=建立时间;如果文 件建立后,没有被读取过,那么访问时间=建立时间,因为不好判断文件是否被改过、读过、其状态是否变过,所以判断文件的建立时间基本上能为不可能。
 
如何查一个文件的三个时间呢?
先用下面的命令来建立一个文件
# date && echo "this is file be used test time of file" >filetime.txt && ll --full-time filetime.txt
Tue Aug  4 15:13:44 HKT 2009
-rw-r--r--    1 root     root           39 2009-08-04 15:13:44.000000000 +0800 filetime.txt
 
通过stat filename.txt来查,如:
# stat filetime.txt 
  File: `filetime.txt'
  Size: 39              Blocks: 8          IO Block: 4096   Regular File
Device: 802h/2050d      Inode: 17          Links: 1    
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-08-04 15:13:44.000000000 +0800
Modify: 2009-08-04 15:13:44.000000000 +0800
Change: 2009-08-04 15:13:44.000000000 +0800

说明:Access访问时间。Modify修改时间。Change状态改动时间。可以stat *查看这个目录所有文件的状态。
ctime=change time
atime=access time
mtime=modifiy time
 
因为这是一个新的文件(filetime.txt),没做过内容、属性的更改,也没读过这个文件,所以三者(访问时间、修改时间、状态改动时间)的时间是一致的,这时文件的修改时间与这三个时间是一样的,是没有疑问的。
 
1、访问时间,读一次这个文件的内容,这个时间就会更新。比如对这个文件运用 more、cat等命令。ls、stat命令都不会修改文件的访问时间。
2、修改时间,修改时间是文件内容最后一次被修改时间。比如:vi后保存文件。ls -l列出的时间就是这个时间。
3、状态改动时间。是该文件的i节点最后一次被修改的时间,通过chmod、chown命令修改一次文件属性,这个时间就会更新。
 
另个除了可以通过stat来查看文件的mtime,ctime,atime等属性,也可以通过ls命令来查看,具体如下:
ls -lc filename 列出文件的 ctime (最后更改时间)
ls -lu filename 列出文件的 atime(最后存取时间)
ls -l filename 列出文件的 mtime (最后修改时间)
 
在linux中stat函数中,用st_atime表示文件数据最近的存取时间(last accessed time);用st_mtime表示文件数据最近的修改时间(last modified time);使用st_ctime表示文件i节点数据最近的修改时间(last i-node's status changed time)。
 
 字段           说明                  例子           ls(-l)
 st_atime  文件数据的最后存取时间       read            -u
 st_mtime  文件数据的最后修改时间       write           缺省
 st_ctime  文件数据的最后更改时间       chown,chmod     -c
 
 
在linux系统中,系统把文件内容数据与i节点数据是分别存放的,i节点数据存放了文件权限与文件属主之类的数据。
 
另外,可以格式化输出文件的三种时间,如:
find . -name file -printf "%AY-%Am-%Ad %AH:%AM:%AS"
find . -name file -printf "%TY-%Tm-%Td %TH:%TM:%TS"
find . -name file -printf "%CY-%Cm-%Cd %CH:%CM:%CS"
 
linux的ctime代表的是文件修改时间,如果文件被修改过就很难知道文件的创建时间,在某些特殊情况下,需要查看文件的创建时间,正常情况下查看文件的ctime是无法实现的。可以使用一个变通的方法来实现保留文件创建时间,但是同时也会牺牲一些其它特性。
 
可以在mount文件的时候使用参数-o noatime,来把系统更新atime的特性关闭。使用了noatime参数挂载后,在文件被修改后文件的atime是不会被改变的,使用stat查看到的atime就是文件的创建时间。
如:
# / sbin/mkfs -t ext3 /dev/ram10
# mount -t ext3 -o noatime /dev/loop0 /mnt/foo
# mount
/dev/ram10 on /mnt/foo type ext3 (rw,noatime)
# cd /mnt/foo
# touch filetime1.txt
# stat filetime1.txt 
  File: `filetime1.txt'
  Size: 0               Blocks: 0          IO Block: 4096   Regular File
Device: 10ah/266d       Inode: 12          Links: 1    
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-08-04 20:51:32.000000000 +0800
Modify: 2009-08-04 20:51:32.000000000 +0800
Change: 2009-08-04 20:51:32.000000000 +0800
 
# echo foo.ok >> filetime1.txt 
[root@logs-bak foo]# stat filetime1.txt 
  File: `filetime1.txt'
  Size: 14              Blocks: 2          IO Block: 4096   Regular File
Device: 10ah/266d       Inode: 12          Links: 1    
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-08-04 20:51:32.000000000 +0800
Modify: 2009-08-04 20:53:27.000000000 +0800
Change: 2009-08-04 20:53:27.000000000 +0800
 
# cat filetime1.txt 
  foo.ok
#stat filetime1.txt 
  File: `filetime1.txt'
  Size: 14              Blocks: 2          IO Block: 4096   Regular File
Device: 10ah/266d       Inode: 12          Links: 1    
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-08-04 20:51:32.000000000 +0800
Modify: 2009-08-04 20:53:27.000000000 +0800
Change: 2009-08-04 20:53:27.000000000 +0800
 
# 通过以上实验可以看出文件的access time 是不变的。
 
接着向下多测试一下.
# vi filetime1.txt
# stat filetime1.txt 
  File: `filetime1.txt'
  Size: 23              Blocks: 2          IO Block: 4096   Regular File
Device: 10ah/266d       Inode: 14          Links: 1    
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-08-04 20:55:05.000000000 +0800
Modify: 2009-08-04 20:55:05.000000000 +0800
Change: 2009-08-04 20:55:05.000000000 +0800
 
# chmod 777 filetime1.txt 
# stat filetime1.txt 
  File: `filetime1.txt'
  Size: 23              Blocks: 2          IO Block: 4096   Regular File
Device: 10ah/266d       Inode: 14          Links: 1    
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2009-08-04 20:55:05.000000000 +0800
Modify: 2009-08-04 20:55:05.000000000 +0800
Change: 2009-08-04 20:57:36.000000000 +0800
可见,chmod后,Ctime的变化。
##############################################################
 
另外,从kernel2.6.29开,还默认集成了一个relatime的属性。可能是因为在文件读操作很频繁的系统
中,atime更新所带来的开销很大,所以很多SA都在挂装文件系统的时候使用noatime属性来停止更新atime。但是有些程序需要根据atime进行一些判断和操作,所以Linux就推出了一个relatime特性。
使 用这个特性来挂装文件系统后,只有当mtime比atime更新的时候,才会更新atime。事实上,这个时候atime和mtime已经是同一个东西 了。所以这个选项就是为了实现对atime的兼容才推出的。并不是一个新的时间属性。使用方法就是通过mount -o relatime /dir来挂装目录。
分享到:
评论

相关推荐

    Linux命令基础9:touch命令和延伸

    `Linux`的`touch`命令是系统中一个非常实用的小工具,主要用于更新文件或目录的访问和修改时间戳,或者在需要时创建新的文件。在软件开发和自动化脚本中,`touch`经常被用于管理项目文件的时间戳,特别是在执行`make...

    鸟哥Linux私房菜

    EXT2(Second Extended Filesystem)是一种早期的Linux文件系统。 8. **fc-cache/fc-list**:在第二十四章第2.2节中提及。fc-cache和fc-list命令用于管理字体缓存和列出可用的字体。 9. **fdisk**:在第八章第3....

    Linux的内核软中断(softirq)执行分析.zip_leavinghzf_linux_theory989

    在Linux操作系统中,中断是处理器响应硬件事件的一种机制,它使得操作系统能够及时处理来自外部设备的请求。软中断(SoftIRQ)是Linux内核中的一种特殊类型中断,它与硬件中断相对,主要用于处理那些不能在硬件中断...

    版本管理工具 CollabNetSubversionEdge-5.1.4-linux-x86-64.tar.gz

    - **分支与合并**:Subversion支持创建分支,允许开发人员在不影响主分支的情况下独立工作,完成后可以将分支上的改动合并回主分支。 - **版本历史**:Subversion记录所有文件和目录的每次修改,可以查看历史版本...

    java系列:svn

    2. 标签(Tag):标记项目在特定时间点的状态,通常用于发布版本,保持不可变。 六、解决冲突 当两个或更多用户修改了同一部分代码,提交时会出现冲突。SVN会标记冲突文件,开发者需要手动解决冲突,可以接受一方的...

    svn使用指导

    - 查看状态:使用`svn status`查看本地文件的改动状态。 - 解决冲突:当多人同时修改同一文件时,SVN会标记冲突,需要手动解决后才能提交。 4. SVN高级用法: - 分支与标签:分支允许开发新功能或修复问题而不...

    subversion-1.9.5.zip

    Subversion(简称SVN)是一种版本控制系统,用于管理和跟踪文件及目录在开发过程中的更改。在给定的压缩包文件"subversion-1.9.5.zip"中,包含的是Subversion 1.9.5版本的相关源代码、文档和其他资源。这个版本发布...

    版本控制:Subversion使用指南

    Subversion提供了一种集中式的版本控制模型,使得团队成员可以安全地进行文件的添加、删除、修改,并能追踪每一次改动,以便于协同工作和代码回溯。 **1. SVN的基本概念** - **仓库(Repository)**:是Subversion...

    SVN 学习笔记

    SVN,全称Subversion,是一种版本控制系统,用于管理和跟踪文件及目录在不同时间的变化,使得多人协作开发时能够有效管理代码版本,防止代码冲突,回溯历史版本,以及方便地进行代码审查。这篇学习笔记主要涵盖了SVN...

    Git中文教程.pdf

    - **工作流**:Git的工作流程通常包括三个主要阶段:**暂存区**(用于准备即将提交的改动)、**提交**(记录项目的一个时间点状态)和**分支合并**(合并不同分支的工作成果)。 #### 三、Git的基本操作 - **初始...

    Git操作与GitHub链接

    - **作用**: 查看当前工作目录中的文件状态,如哪些文件被修改但未提交到暂存区或仓库等。 - **工作区**: 工作区是指项目所在的目录,其中的文件可能是已跟踪的或者未跟踪的新文件。 - **暂存区**: 暂存区是一个虚拟...

    详尽的svn使用规范

    2. 恢复(Revert):撤销本地更改,使文件回到上次提交的状态。 3. 比较(Diff):比较文件或目录的两个版本之间的差异,帮助理解变更。 六、最佳实践 1. 常规提交:频繁提交小的、可测试的改动,以保持仓库的...

    三个svn使用文档

    - `svn diff`用于查看文件的改动,`svn blame`则可以查看每一行代码的最后修改者。 7. **分支和合并(Branching and Merging)**: - 分支允许开发人员在不影响主线(主分支)的情况下进行开发。`svn copy`创建...

    progit中文版

    - **三种状态**:任何文件都处于三种状态之一:已提交、已修改或已暂存。 #### 二、Git的安装与配置 **1.4 安装Git** - **从源代码安装**:适用于Linux系统,需要编译源代码。 - **在Linux上安装**:多数现代Linux...

    cvs工具中文使用手册

    - **补丁(Patch)**:创建差异文件(patch),用于在不访问仓库的情况下传递修改。 ### 7. 结论 CVS作为开源的版本控制系统,为开发者提供了一套强大的工具来管理代码,协同工作。通过熟练掌握CVS的基本操作和...

    subversion

    Subversion(SVN)是一种广泛使用的版本控制系统,用于管理软件项目的源代码和其他文件的更改历史。在团队开发环境中,Subversion扮演着至关重要的角色,它允许开发者协作工作,同时跟踪每个成员对项目所做的修改,...

    svn版本控制器

    版本控制是一种管理系统,它记录一个或多个文件或目录随时间的改变。它允许用户回滚到以前的版本,查看修改历史,合并不同人的改动,并且有效地管理团队间的协同工作。 ### 2. SVN的基本概念 - **仓库(Repository...

    subversion1.8.13版本 svn版本控制器服务器安装包

    Subversion(简称svn)是开源的版本控制系统,用于管理文件和目录在不同时间的更改,以便多人协同工作。Subversion1.8.13是该系统的一个特定版本,提供了许多改进和新特性。 Subversion的核心功能包括: 1. **版本...

    svn.rar_svn教程

    **SVN(Subversion)** 是一款开源的版本控制系统,用于管理软件项目中的源代码、文档等文件的历史版本,使得多人协作开发时可以有效管理和跟踪文件的修改历史,避免冲突并便于回溯到任何历史状态。这篇教程将涵盖...

Global site tag (gtag.js) - Google Analytics