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

cu6pst1q  于 2023-03-07  发布在  Linux
关注(0)|答案(9)|浏览(132)

给定一个time_t:

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

我正在寻找一个bash一行程序,列出所有更新的文件。比较应该考虑到时区。
就像

find . --newer 1312603983

但是使用的是time_t而不是文件。

zazmityj

zazmityj1#

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

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

要查找上周的所有内容,请根据需要使用“1周前”或“7天前”

wqnecbli

wqnecbli2#

也许有人可以使用它。递归地找到在某个时间段内修改过的所有文件,只需运行:

find . -type f -newermt "2013-06-01" \! -newermt "2013-06-20"
    • 注:**

包括第一个日期,不包括第二个日期,因此类似于

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

始终返回0

nwlqm0z1

nwlqm0z13#

这有点绕路,因为touch不接受原始的time_t值,但它应该在脚本中非常安全地完成这项工作。(date-r选项在MacOSX中存在;我没有仔细检查GNU。)通过直接在touch命令行中编写命令替换,可以避免'time'变量。

time=$(date -r 1312603983 '+%Y%m%d%H%M.%S')
marker=/tmp/marker.$$
trap "rm -f $marker; exit 1" 0 1 2 3 13 15
touch -t $time $marker
find . -type f -newer $marker
rm -f $marker
trap 0
bjg7j2ky

bjg7j2ky4#

假设find -newermt是一个现代版本,它的功能非常强大:

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

或者,如果要指定time_t(自epoch以来的秒数):

find -newermt @1568670245

作为参考,-newermt未直接列在find的手册页中。相反,它显示为-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

pqwbnv8z

pqwbnv8z5#

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

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

要在这些文件中查找“foo”:

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

gdx19jrr6#

也可以在没有标记文件的情况下执行此操作。
到日期的%s格式是自纪元以来的秒数。find的-mmin标志采用以分钟为单位的参数,因此将以秒为单位的差值除以60。age前面的“-”表示查找上次修改时间小于age的文件。

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

对于更新版本的gnu find,您可以使用-newermt,这使得它变得微不足道。

pxiryf3j

pxiryf3j7#

PowerShell available on Linux已经存在一段时间了,所以我建议使用它,因为它不仅处理纯文本,而且处理真实的对象,因此避免了格式化,使任务更容易

ls -recurse | where lastwritetime -gt ((get-date).AddDays(-1))
8zzbczxx

8zzbczxx8#

这是另一种方法,你可以使用touch -dfind /dir -newer命令递归地查找比给定时间戳更新的文件。
例如,如果您需要查找“1 June 2018 11:02”之后的文件,则可以使用此创建日期创建文件。

touch -d '1 June 2018 11:02' ref_timestamp

然后,您可以使用文件时间戳作为find命令中的参考。

find /dir -newer ref_timestamp
djp7away

djp7away9#

于是又有了另一种方式(而且在某种程度上是便携式的--

(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 '{}'

相关问题