递归查找比给定时间更新的所有文件

时间:2011-08-06 04:22:49

标签: linux bash

给定time_t:

⚡ date -ur 1312603983
Sat  6 Aug 2011 04:13:03 UTC

我正在寻找一个bash one-liner,列出所有较新的文件。比较应考虑时区。

这样的东西
find . --newer 1312603983

但是使用time_t而不是文件。

7 个答案:

答案 0 :(得分:126)

您可以找到最后一天创建/修改的每个文件,使用此示例:

find /directory -newermt $(date +%Y-%m-%d -d '1 day ago') -type f -print

在上周查找所有内容,请使用“1周前”或“7天前” 你想要的任何东西

答案 1 :(得分:22)

也许有人可以使用它。查找在递归的特定时间范围内修改的所有文件,只需运行:

find . -type f -newermt "2013-06-01" \! -newermt "2013-06-20"

答案 2 :(得分:16)

这有点迂回,因为touch没有采用原始time_t值,但它应该在脚本中非常安全地完成工作。 (-r的{​​{1}}选项出现在MacOS X中;我没有仔细检查过GNU。)通过直接在{{1}中编写命令替换,可以避免'time'变量命令行。

date

答案 3 :(得分:10)

给定1494500000的unix时间戳(自纪元以来的秒数),执行:

find . -type f -newermt "$(date '+%Y-%m-%d %H:%M:%S' -d @1494500000)"

为" foo":

grep这些文件
find . -type f -newermt "$(date '+%Y-%m-%d %H:%M:%S' -d @1494500000)" -exec grep -H 'foo' '{}' \;

答案 4 :(得分:5)

您也可以在没有标记文件的情况下执行此操作。

迄今为止的%s格式是自纪元以来的秒数。 find的-mmin标志以分钟为单位取一个参数,因此将差值除以秒数。并且年龄前面的“ - ”表示查找最后一次修改小于年龄的文件。

time=1312603983
now=$(date +'%s')
((age = (now - time) / 60))
find . -type f -mmin -$age

使用较新版本的gnu find,你可以使用-newermt,这使它变得微不足道。

答案 5 :(得分:0)

所以还有另一种方式(它在某种程度上可移植_

(python <<EOF
import fnmatch
import os
import os.path as path
import time

matches = []
def find(dirname=None, newerThan=3*24*3600, olderThan=None):
    for root, dirnames, filenames in os.walk(dirname or '.'):
        for filename in fnmatch.filter(filenames, '*'):
            filepath = os.path.join(root, filename)
            matches.append(path)
            ts_now = time.time()
            newer = ts_now - path.getmtime(filepath) < newerThan
            older = ts_now - path.getmtime(filepath) > newerThan
            if newerThan and newer or olderThan and older: print filepath
    for dirname in dirnames:
        if dirname not in ['.', '..']:
            print 'dir:', dirname
            find(dirname)
find('.')
EOF
) | xargs -I '{}' echo found file modified within 3 days '{}'

答案 6 :(得分:0)

假设是现代版本,find -newermt的功能很强大:

find -newermt '10 minutes ago' ## other units work too, see `Date input formats`

或者,如果您要指定time_t(距离epoch的秒数):

find -newermt @1568670245

作为参考,-newermt并未直接在手册页中列出以供查找。相反,它显示为-newerXY,其中XYmt的占位符。其他替代产品是合法的,但不适用于此解决方案。

来自man find -newerXY

  

时间规范被解释为GNU date的-d选项的参数。

因此,以下等效于初始示例:

find -newermt "$(date '+%Y-%m-%d %H:%M:%S' -d '10 minutes ago')" ## long form using 'date'
find -newermt "@$(date +%s -d '10 minutes ago')" ## short form using 'date' -- notice '@'

date -d(和find -newermt)参数非常灵活,但是文档晦涩难懂。这似乎是一个要点:Date input formats