在Linux终端中,如何显示文件夹的最后修改日期(考虑其中的内容)?

88

好的,这就是问题所在。假设我有一个名为“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-01-05,/web/ 目录本身也被报告为最后修改时间是在2010-11-18。

我需要做的是,让我的 /web/ 目录的最后修改日期报告为该目录下任何文件/目录的最新修改日期(递归地计算)。

我该如何做到这一点?

4个回答

73

类似于:

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

解释:

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

1
根据coreutils文档的说明,您可以考虑使用head -n 1sed 1q代替过时的语法。 - sappjw
2
所以现在使用 head -1 命令只返回第一行已经过时了...天啊,我还记得它曾经是新的标志 - 我真的太老了!!! :o) - Paulo Scardine
这是一个非常好的例子,展示了Linux命令行的优点和缺点。 - Ternary
1
在大多数情况下,我会添加“-type f”标志,以便仅检查文件的修改时间。我记不起来我使用的是哪个程序,但是当我将文件从一个位置复制到另一个位置时,它会保留文件的时间戳,但将目录标记为全新状态,这会影响结果。 - IQAndreas
多么用户友好的操作系统。 - EugZol

31

如果你有一个支持 -printf 参数的 find 版本(例如 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" *

7

如果可以的话,我会投票支持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来解决他的问题?这一点应该明确。

3
好问题,虽然我在标签里写了“bash,脚本,shell”,但我认为这很明显。是的,我想用Bash解决这个问题。这是为了备份服务器文件。我认为问题现在已经解决了,解决方案很完美 :) - Frantisek
你似乎同时使用了 statfind 的内置 -printf 标志,然后基本上抛弃了其中一个结果。我猜你应该更喜欢后者,正如另一个答案中所概述的那样(当 find 已经在一个进程中完成所有操作时,没有必要为每个文件生成一个单独的进程)。 - tripleee

4

在我看来,只需简单地执行:ls -lt mydirectory 就可以完成工作...


1
它并不会,但很容易误解。在目录上使用ls -t(或--time选项)将显示该目录的创建时间,但不会反映该目录中文件的最后修改时间。 - dshaw
1
ls -lt mydirectory 显示该目录中文件和子目录的最后修改时间... - Rodolfo Medina
这仅适用于mydirectory内的文件,不适用于mydirectory中任何子目录中的文件。请参考讨论。 - yagus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接