目录的最后修改时间
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下编辑了一个文件。但是,myDir的mtime没有更新。
因此,改变目录下文件的内容不会改变目录的最后修改时间。
我们应该注意,有时我们使用 带有*-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
我们可以看到myDir的mtime已经改变。
接下来,让我们删除一个子目录:
$ 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