Рекурсивно найти все файлы новее заданного времени


учитывая значение time_t:

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

Я ищу bash one-liner, в котором перечислены все файлы новее. Сравнение должно учитывать часовой пояс.

что-то вроде

find . --newer 1312603983

но с time_t вместо файла.

6 51

6 ответов:

это немного окольный, потому что touch не принимает raw time_t значение, но он должен делать работу довольно безопасно в скрипте. (Тег до date присутствует в MacOS X; я не перепроверял GNU.) Переменной' time ' можно было бы избежать, написав подстановку команд непосредственно в touch командная строка.

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

вы можете найти каждый файл, который был создан / изменен в последний день, используйте этот пример:

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

для поиска всего на прошлой неделе, используйте '1 неделю назад' или '7 дней назад' все, что вы хотите

может быть, кто-то может использовать его. Найти все файлы, которые были изменены в течение определенного времени рекурсивно, просто запустите:

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

учитывая метку времени Unix (количество секунд с начала эпохи) в 1494500000, do:

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

чтобы grep эти файлы для "foo":

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

вы также можете сделать это без маркерный файл.

формат %s На сегодняшний день составляет секунды с момента эпохи. флаг find - mmin принимает аргумент в минутах, поэтому разделите разницу в секундах на 60. И " - " перед возрастом означает найти файлы, последняя модификация которых меньше возраста.

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

С новыми версиями gnu find вы можете использовать -newermt, что делает его тривиальным.

Так что есть другой способ (и он переносим в некоторой степени_

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