递归获取目录的最后修改时间

递归获取目录的最后修改时间

如何获取目录或其子目录中任何文件上次更改的时间?例如

Dir - changed 1/1/1
    Sub Dir 1 - changed 2/1/1
        Sub Dir 2 - changed 3/1/1
            File 1 - changed 10/1/1
    File 2 - change 5/1/1

此命令的输出Dir应为 10/1/1(File 1是最后修改的文件名)。获取最后修改的文件名是一个额外好处,但不是必需的。

答案1

find <dir> -type f -printf '%T@\t%p\n' | sort -r -k1 | head -n1返回以下形式的行:

<seconds since epoch[1]><tab><filename>

别名或放入像以下示例中的脚本来打印文件名或日期。


让我们创建一个测试树:

$ date -u; mkdir -p a/{b,c,d}/{e,f,g}
Sat May 28 17:37:52 UTC 2011

$ date -u; touch a/{b,c,d}/{e,f,g}/{foo,bar,baz}; sleep 1; date -u; touch a/c/f/bar
Sat May 28 17:38:17 UTC 2011
Sat May 28 17:38:18 UTC 2011

获取日期a

$ date -ud @$(find a -type f -printf '%T@\t%p\n' | sort -r -k1 | head -n1 | cut -f1)
Sat May 28 17:38:18 UTC 2011

获取文件路径:

$ find a -type f -printf '%T@\t%p\n' | sort -r -k1 | head -n1 | cut -f2
a/c/f/bar

[1]:参见Unix 时间在 Wikipedia 上查看“Unix 纪元”的解释。


脚本示例:

#!/bin/sh
if test ! -d "${1:-.}"
then
    echo not a directory: ${1:-.} >&2
    exit 1
fi
date -d @$(find "${1:-.}" -type f -printf '%T@\t%p\n' | sort -r -k1 | head -n1 | cut -f1)

调用时带或不带<dir>参数。如果不带参数,它将使用当前目录。

答案2

我使用 FAR Manager 做了类似的事情,应该可以解决你的问题:

  FAR 管理器(免费、开源)
  http://www.farmanager.com/

以下是我的做法:

  • 导航到我想要开始搜索的目录
  • 按 Alt-F7(调出搜索对话框)
  • 搜索*.*(所有文件)
  • 搜索完成后选择“面板”
  • 按 F9,然后按 L,再按 L 显示完整文件列表详细信息
  • 按 CTRL-F5 按修改时间戳对所有内容进行排序

“面板”将所有搜索结果放在一个可排序的长列表中。您还可以使用其他排序选项(按住 CTRL 键将在屏幕底部显示这些选项),再次按下相同的排序组合键将导致排序以相反的方向进行(您可以通过这种方式在升序和降序之间不断切换)。

尽管目录本身可能没有最新的时间戳,但至少您可以通过这种方式找到最新的文件,然后您将在列表中看到完整路径。希望这能帮助您获得所需的信息?

在此处输入图片描述

答案3

在 DOS 中,此命令可能适合您,尽管由于 DOS 的 DIR 命令的固有限制而并不完美:

  • 方向 /A/OD/S/TW

/TW 开关对您来说是最有趣的,因为它的意思是“显示最后写入日期”(这是我用“DIR /?”找到的最接近最后修改日期的开关)。

/OD 开关使输出按日期排序。DIR 命令应该会发现您正在使用 /TW 开关,并自动按此日期排序。

/S 开关允许在子目录中进行递归搜索。

/A 开关包括所有类型的文件,包括隐藏文件。如果您不想包括隐藏文件[和其他此类文件],请忽略此开关。

相关内容