Contents

目录的最后修改时间

1. 概述

当我们在 Linux 命令行中处理目录时,有时我们需要知道目录的最后修改时间。

在本教程中,我们将学习如何获取目录的最后修改时间。

此外,我们将讨论对目录的哪些更改会影响修改时间。

2. 获取目录的最后修改时间

**在 Linux 中,有时我们使用缩写形式“ mtime”来表示文件的最后修改/更改时间。

在本教程中,我们将使用两个命令来读取目录的最后修改时间:*stat 命令和date *命令。

接下来,让我们看看他们的行动。

2.1. 使用stat命令

stat 命令是报告文件或文件系统状态的绝佳实用程序。在文件上使用这个命令非常简单:

$ stat myDir
  File: myDir
  Size: 40        	Blocks: 0          IO Block: 4096   directory
Device: 23h/35d	Inode: 87601       Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1000/    kent)   Gid: ( 1000/    kent)
Access: 2021-08-31 20:59:05.895057894 +0200
Modify: 2021-08-31 20:59:05.895057894 +0200
Change: 2021-08-31 20:59:05.895057894 +0200
 Birth: -

如上面的输出所示,stat命令显示myDir目录的状态。 最后修改时间显示在该行中:

Modify: 2021-08-31 20:59:05.895057894 +0200

使用 stat命令,我们还可以通过 -c FORMAT选项控制输出。

显示mtime有两种格式:

  • %y - 以人类可读的格式显示上次数据修改的时间
  • %Y – 显示自 Epoch 以来最后一次数据修改的时间(以秒为单位)

让我们用myDir目录测试这两个选项:

$ stat -c %y myDir
2021-08-31 20:59:05.895057894 +0200
$ stat -c %Y myDir
1630436345

2.2. 使用date命令

Coreutils 包中的date命令支持-r*选项来提取给定文件的最后修改时间。*

此外,我们可以使用date +FORMATS控制输出格式

现在,让我们看几个使用 date打印myDir目录的最后修改时间的示例:

$ date -r myDir +"%F %T.%3N" 
2021-08-31 20:59:05.895
$ date -r myDir +"%s"
1630436345

如上面的示例所示,我们可以使用 date命令以人类可读的形式打印myDir 的mtime,并且以 Epoch 格式开始的秒数为单位。

正如我们所见,无论使用stat还是 date命令,获取文件或目录的最后修改时间都非常简单。 接下来,我们进入一个有趣的话题:哪些变化会影响目录的最后修改时间?

3. 什么会影响目录的最后修改时间

“最后修改时间”,顾名思义,就是记录最后一次修改目录的时间。但是,并非对目录的所有修改都会影响上次修改时间。

有时,这可能不是很清楚。

首先,让我们创建一个目录作为我们的示例,并在其下放置一些文件和子目录:

$  tree myDir 
myDir
├── file1.txt
├── file2.txt
├── file3.txt
├── subDir1
│   ├── sub1_file1.txt
│   └── sub1_file2.txt
└── subDir2
    ├── sub2_file1.txt
    └── sub2_file2.txt
2 directories, 7 files

接下来,让我们仔细看看它。

3.1. 重命名目录

可能,我们认为如果我们重命名了目录,当然,我们已经修改了它。所以,最后修改时间应该更新。

现在,让我们看看它是否以这种方式工作:

$ stat -c %Y myDir
1630440905
$ mv myDir myDirRenamed
$ stat -c %Y myDirRenamed 
1630440905

如测试输出所示,我们重命名操作前后的最后修改时间相同。

因此,重命名目录不会改变其最后修改时间

3.2. 更改目录的权限

我们可能会认为,如果重命名目录不会更新上次修改时间,那么更改其权限应该会影响其mtime

接下来,让我们做一个测试:

$ stat -c %Y myDir
1630440905
$ ls -ld myDir
drwxr-xr-x 4 kent kent 140 Aug 31 22:15 myDir/
$ chmod +777 myDir
$ ls -ld myDir
drwxrwxrwx 4 kent kent 140 Aug 31 22:15 myDir/
$ stat -c %Y myDir
1630440905

事实证明,更改目录的权限不会影响其最后修改时间

3.3. 更改目录下文件的内容

接下来,让我们测试更改目录下文件的内容是否会更新其mtime

$ stat -c %Y myDir
1630440905
$ echo "Adding some new data" >> myDir/file1.txt
$ stat -c %Y myDir
1630440905

在测试中,我们在myDir下编辑了一个文件。但是,myDirmtime没有更新。

因此,改变目录下文件的内容不会改变目录的最后修改时间

我们应该注意,有时我们使用 带有*-mtime*选项的find 命令来搜索一段时间未修改的文件。

例如,我们可以列出 30 天内未修改的目录:

find directory -type d -mtime +30

但是,当我们将结果用于进一步处理时,我们应该小心。这是因为结果中的所有目录都可能包含在过去 30 天内更改过的文件。

3.4. 添加新文件或子目录

接下来,我们将测试向目录添加新文件或新子目录是否会更改其mtime

首先,让我们测试添加新文件的场景:

$ stat -c %Y myDir
1630440905
$ touch myDir/newFile.txt
$ stat -c %Y myDir
1630442785

经测试,myDir下添加新文件后,最后修改时间发生了变化!

接下来,让我们添加一个新的子目录:

$ stat -c %Y myDir
1630442785
$ mkdir myDir/newSub
$ stat -c %Y myDir
1630442998

通过这两个测试,我们现在知道在目录中添加文件或子目录会改变它的最后修改时间

3.5. 删除文件或子目录

接下来,让我们测试从myDir中删除文件或子目录是否 会更新其mtime

首先,让我们删除我们刚刚创建的文件:

$ stat -c %Y myDir
1630442998
$ rm myDir/newFile.txt
$ stat -c %Y myDir
1630443387

我们可以看到myDirmtime已经改变。

接下来,让我们删除一个子目录:

$ stat -c %Y myDir
1630443387
$ rm -r myDir/newSub
$ stat -c %Y myDir
1630443522

因此,从目录中删除文件或子目录将更新其最后修改时间

3.6. 重命名目录下的文件或子目录

我们也可以做一个类似的测试,看到重命名目录下的文件或子目录也会改变它的最后修改时间

$ stat -c %Y myDir
1630443522
$ mv myDir/file1.txt newName1.txt
$ stat -c %Y myDir
1630443643
$ stat -c %Y myDir
1630443643
$ mv myDir/subDir1 myDir/subDirNew
$ stat -c %Y myDir
1630443809