获取文件夹(或子文件/文件夹)的最后修改日期和时间

10

是否可以获取文件夹的修改日期和时间?
我知道您可以使用stat -f“%m”folder 来获取,但它不反映子文件/文件夹的更改。

以下方法无效:

  • ls -l folder - 不会反映文件夹内部的更改
  • stat -f“%m”folder - 同上
  • date -r folder - 再次相同
  • find foo bar baz -printf - 我的版本中不存在 printf 选项

版本信息:

  • 操作系统:Mac OS X 10.7.1
  • Bash:GNU bash,版本3.2.48(1)-release(x86_64-apple-darwin11)

没有一个可行,因为在 Mac OS X 10.7.1 中 find 命令没有实现 printf 选项。 - Tyilo
我更熟悉GNU/Linux而不是BSD。 find -printf 经常很有用,但如果缺少它,也许你可以使用 ls -lRt | head -n 1 (-t 用于按修改时间排序,-R 用于递归列出)。 - jw013
  1. 是的
  2. 大约6个层级深度
- Tyilo
@jw03 是的,但它首先按父目录排序,而不仅仅是日期/时间。 - Tyilo
1
@Tyilo 是的,你说得对。ls并不是最好的方法。也许可以尝试使用find -execdir stat -f '%m %N' \{} \; | sort -nr | head -n 1来替换find -printf。这个例子仍然需要添加空终止符以正确处理所有文件名,但是总体思路应该是可行的。 - jw013
显示剩余3条评论
4个回答

13

解决方案:

find . -exec stat -f "%m" \{} \; | sort -n -r | head -1

解释:

  1. find 命令遍历当前目录(.),并对于每个找到的文件执行 (-exec) 命令 stat -f "%m"stat -f "%m" 打印文件的最后修改 Unix 时间戳。
  2. sort -n -r 数字逆序排序 (-n) find 命令的输出。这将首先列出最新的修改时间戳。
  3. head -1 然后从 sort 的输出中提取第一行。 这是所有文件的最新修改 Unix 时间戳。

最好能够得到一些解释,说明每个部分的作用是什么,这个命令导致了我的电脑崩溃。 - john-jones
@HermannIngjaldsson 添加了一个解释。如果您使用的是基于Linux而不是基于BSD的操作系统,则可能不适用。 - Tyilo
假设有人在文件夹中删除了某个文件,这将会给出错误的信息。例如说,你想为一个文件夹维护一个MD5哈希值,并且想知道何时需要重新计算它。那么这种方法是无法奏效的... - Cookie

7
你可以尝试使用 'date -r 文件夹' 命令来获取最后修改日期。

4
-r 秒数 打印由秒数表示的日期和时间,其中秒数是自纪元(1970年1月1日00:00:00 UTC)以来经过的秒数,可以用十进制、八进制或十六进制表示。请参见 time(3)。 - Tyilo
1
+1 @Tylio 但是为了澄清 - "date -r folder +'%s'" - 将返回自纪元以来的秒数,请查看 "date --help" 获取更多信息。 - ChrisK
4
@ChrisK中GNU date中的 -r 表示参考文件,这似乎是你所指的。而在BSD date中(即Mac OS X使用的版本),它的行为与Tyilo的评论中引用的相同。请注意,我已尽力使翻译通俗易懂,但并没有改变原意。 - jw013

0
你可以随时从 ls 获取它:
ls -ld mydir | awk -F' '  '{ print $6 " "$7 }'

不考虑子文件。 - Tyilo
我不确定你所说的“子文件”是什么意思,但在我的系统中,创建在该目录中的新文件将更新父目录的修改时间。 - JJ.
很遗憾,@JJ不在我的名单上。 - Tyilo
奇怪,我使用Ubuntu Linux FWIW。 - JJ.
我正在使用Lubuntu 13.04,创建子文件夹中的新文件不会更新父目录。 - john-jones

0
如果您需要在构建后清除缓存,则可以检查最后更改的时间并像这样删除它。

sh("find ~/Library/Developer/Xcode/DerivedData/ -type d -maxdepth 1 -mmin +360 -name 'Cache-folder-*' -print0 | xargs -0 -I {} /bin/rm -rf '{}' || echo 'There is no such folder! Start script execution' ; exit 0")



sh("find ~/Library/Developer/Xcode/DerivedData/ -type d -maxdepth 1 -mtime 0 -name 'Cache-folder-*' -ls -exec rm -r {} \\;")


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