【问题标题】:in linux terminal, how do I show the folder's last modification date, taking its content into consideration?在 linux 终端中,如何显示文件夹的最后修改日期,并考虑其内容?
【发布时间】:2011-06-27 04:52:22
【问题描述】:

所以这就是交易。假设我有一个名为“web”的目录,所以

$ ls -la

drwx------  4 rimmer rimmer 4096 2010-11-18 06:02 web

但是在这个目录里面,web/php/

$ ls -la

-rw-r--r-- 1 rimmer rimmer 1957 2011-01-05 08:44 index.php

这意味着即使我的目录 /web/php/index.php 的内容最后一次修改是在 2011 年 1 月 5 日,但 /web/ 目录本身会报告为最后一次修改时间是 2010 年 11 月 18 日.

我需要做的是将我的 /web/ 目录的最后修改日期报告为该目录中任何文件/目录的最新修改日期,递归。

我该怎么做?

【问题讨论】:

    标签: linux bash shell scripting ubuntu


    【解决方案1】:

    类似:

    find /path/ -type f -exec stat \{} --printf="%y\n" \; | 
         sort -n -r | 
         head -n 1
    

    解释:

    • find 命令将打印每个文件的修改时间,递归地忽略目录(根据 IQAndreas 的评论,您不能依赖文件夹时间戳)
    • sort -n(数字)-r(反向)
    • head -n 1:获取第一个条目

    【讨论】:

    • 根据the coreutils documentation,您可能会考虑使用head -n 1sed 1q 而不是过时的语法。
    • 所以head -1 只返回第一行现在已经过时了......伙计,我记得它曾经是新标志 - 我那么老了! :o)
    • 这是一个很好的例子,说明了 linux 命令行的优缺点。
    • 在大多数情况下,我会添加-type f 标志,因此它只检查文件的修改时间。我不记得我使用的是哪个程序,但是当我将文件从一个位置复制到另一个位置时,它会保留文件的时间戳,但会将目录标记为全新的,从而忽略结果。
    • 多么友好的操作系统
    【解决方案2】:

    如果您有支持-printffind 版本(例如GNU find),则无需重复调用stat

    find /some/dir -printf "%T+\n" | sort -nr | head -n 1
    

    find /some/dir -printf "%TY-%Tm-%Td %TT\n" | sort -nr | head -n 1
    

    如果你不需要递归:

    stat --printf="%y\n" *
    

    【讨论】:

      【解决方案3】:

      如果可以,我会投票支持 Paulo 的答案。我测试了它并理解了这个概念。我可以确认它有效。 find 命令可以输出很多参数。 例如,在--printf 子句中添加以下内容:

      %a for attributes in the octal format
      %n for the file name including a complete path
      

      例子:

      find Desktop/ -exec stat \{} --printf="%y %n\n" \; | sort -n -r | head -1
      2011-02-14 22:57:39.000000000 +0100 Desktop/new file
      

      让我也提出这个问题: 这个问题的作者是想用 Bash 还是 PHP 来解决他的问题?应该指定。

      【讨论】:

      • 好问题,但我认为这很明显,因为我的标签说“bash,脚本,shell”。我想用 Bash 解决这个问题,是的。它用于备份服务器文件。我认为现在问题已经解决了,解决方案完美:)
      • 你似乎在使用both statfind 的内置-printf 标志,然后基本上扔掉其中一个结果。我猜你应该更喜欢后者而不是前者,如单独的答案中所述(当find 已经在一个进程中完成所有操作时,无需为每个文件生成单独的进程)。
      【解决方案4】:

      在我看来,这很简单:ls -lt mydirectory 完成了这项工作......

      【讨论】:

      • 它没有,但很容易想到。目录上的ls -t(或--time 选项)将显示该目录的创建时间,但不会反映该目录中文件的最后修改时间。
      • `ls -lt mydirectory' 向我显示该目录中文件和子目录的最后修改时间...
      • 这仅适用于 mydirectory 中的文件,不适用于 mydirectory 中任何子目录中的文件。请参阅this 讨论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 2011-07-02
      • 2011-09-17
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多