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


73

所以这是交易。假设我有一个名为“ 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 /目录的最后修改日期报告为该目录内任何文件/目录的最新修改日期。

我该怎么做呢?

Answers:


55

就像是:

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

说明:

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

1
根据coreutils文档,您可以考虑使用head -n 1sed 1q代替过时的语法。
sappjw 2012年

1
因此head -1,仅返回第一行现在已过时了……伙计,我记得它曾经是新的标志-我那时已经老了!:o)
Paulo Scardine 2015年

这是linux命令行优缺点的一个很好的例子。
三元

1
在大多数情况下,我会添加该-type f标志,因此它仅检查文件的修改时间。我不记得我使用的是哪个程序,但是当我将文件从一个位置复制到另一个位置时,它保留了文件的时间戳,但将目录标记为全新目录,结果不理想。
IQAndreas '16

25

如果您有一个支持的版本find(例如GNU find),-printf则无需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

如果可以的话,我将投票支持保罗的答案。我对其进行了测试并理解了这个概念。我可以确认它有效。该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解决此问题,是的。用于备份服务器文件。我认为问题已解决,解决方案非常完美:)
Richard Rodriguez

你似乎可以用两个 stat和内置-printf的标志find,然后基本上扔掉的结果之一。我猜您应该选择后者而不是前者,如在单独的答案中所概述的(当find已经在一个进程中完成所有操作时,无需为每个文件生成单独的进程)。
Tripleee'Dec 27,17

0

在我看来,这简直就是:ls -lt mydirectory做这份工作...


虽然不是,但是很容易想到这一点。ls -t(或--time选项)目录上的内容(或选项)将在创建该目录时显示,但不会反映该目录中文件的最后修改时间。
dshaw

“ ls -lt mydirectory”向我显示了该目录中文件和子目录的最后修改时间...
Rodolfo Medina
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.