Linux:文件修改时间如何影响目录修改时间和目录访问时间?

Bul*_*ush 10 find date-modified bash-scripting redhat-enterprise-linux

我想了解更多关于文件访问时间和文件修改时间如何与目录访问和修改时间相关的信息。

我确实阅读了“此处允许的问题”,但如果有针对此问题的更好的 StackExchange 站点,请告诉我。这不是 Ubuntu 系统,所以 askubuntu.com 已出局。

系统:

  • 红帽企业 Linux 5.5.56。不,我们不能升级,请不要问这个。
  • 我尝试坚持使用 bash。
  • 查找版本 4.2.27

问题:我想制作一个 bash 脚本,从运行脚本的当前目录开始,我想列出至少 300 天没有修改的目录和子目录。我正在检查的这些目录包含的文件的修改时间可能晚于目录修改时间。我只想列出包含“JOB”而不是“DIV”的目录名称,区分大小写。

注意:我们的目录是这样排列的:CLS_xxx 目录将包含许多 GRP_xxx 目录。GRP_xxx 目录将包含许多 JOB_xxx 目录。JOB_dirs 可能包含许多 DIV_xxx 目录。因此,虽然我可能位于包含所有 CLS 目录的目录中,但我只想显示包含 JOB 的目录。

/path/to/containerdir/
  CLS_xxx/
    GRP_xxx/
      JOB_xxx/
        Files under here might be modified later than the JOB_xxx dir.
        DIV_xxx/
          files under DIV/ might be modified later than the JOB_xxx dir.
Run Code Online (Sandbox Code Playgroud)

清如泥?:)

问题:

  • 如果在名为 JOB_1234 的目录中修改文件,这对目录修改时间有何影响?
  • 更改文件会影响目录访问时间吗?我应该在查找中使用目录访问时间吗?
  • 是否有目录访问时间的开关,因为我在系统的手册页中没有看到一个。
  • 目录修改时间是在什么时候改变的?我们什么时候更改权限呢?更改所有者或组?还要别的吗?
  • 目录访问时间何时更改?当访问或更改目录中的文件时?

我正在阅读查找手册页,但没有找到我的答案。我还从我的 Google 搜索中阅读了大约 8 页find,但也没有在那里找到我的答案。

此命令适用于查找目录修改时间 > 300 天。

find . -type d -print -mtime +300 | grep -v 'DIV' | grep -P 'JOB' | sort > $outfile
Run Code Online (Sandbox Code Playgroud)

但我的问题更多的是,如果目录中的文件最近被修改了怎么办?给定一个以 JOB_ 开头的目录,如何找到每个 JOB_ 目录和该 JOB_ 目录中的文件的最新文件或目录修改时间?

谢谢你。

Sam*_*nen 11

很多问题,所以我将回答“它是如何工作的”部分,而不是“我如何让它工作”。

这取决于所使用的文件系统。我根据 ext[234] 回答,其他人可能以相同或类似的方式工作。

  1. 不,如果文件被修改,目录修改时间不会改变。在这种情况下,目录不会以任何方式被修改,它仍然包含与其链接的相同文件、目录等。

  2. 与前面相同,如果“更改文件”的含义与“修改某个文件”相同。

    如果您删除一个文件并添加一个具有相同名称的新文件,或者将另一个文件移动到另一个文件的“顶部”,则该目录将被修改。

  3. 当目录被修改时。这意味着将 inode 链接/取消链接到其中,例如文件或子目录。

    权限更改会更改更改时间,但不会更改修改时间。这些是不同的。

    如果将目录移到别处,更改时间会更改,但修改时间不会。

  4. 当目录被访问时,目录访问时间会改变,如果它没有被关闭。该卷可能使用noatime挂载,这意味着通常不会写入上次访问时间。请注意,目录数据也被缓存。

    此外,如果您只是访问子目录,则父目录的访问时间不会改变。

因此,如果您搜索过去 300 天内未更改的目录,它们可能仍包含已更改的文件。文件创建或删除尚未发生,但编辑内容可能发生。你将不得不按照你说的检查文件。