LINUX.ORG.RU

Each file has three distinct associated timestamps: the time of last data access, the time of last data modification, and the time the file status last changed.

fornlr ★★★★★
()

man find. Особенно в секции -mmin, -cmin и -amin

а-ля

if test `find "/path/to/files" -mmin +120`
ymn ★★★★★
()

Тебе нужен find с опцией -daystart, юный падаван. Пример программы:

if [[ "`find "$1" -maxdepth 0 -daystart -mtime 0 2>/dev/null`" == "$1" ]] ; then
    echo today
else
    echo not today
fi

Результат работы:

$ bash /tmp/1.sh ~
today
$ bash /tmp/1.sh ~/.bash_history 
today
$ bash /tmp/1.sh ~/.bashrc
not today
$ bash /tmp/1.sh ~/.Xauthority 
today

anonymous
()
if [ `stat -c '%Y' "$FILENAME"` -ge `date -d 'today 00:00' +%s` ]; then
   echo "True"
else
   echo "False"
fi
sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 1)

man find.

определись только: может ты имел ввиду «за последние 24 часа», да? Или нет?

Если да, то во первых понятия «создан» вряд-ли у тебя работает (в ext4 оно только недавно появилось), ты выбирай из: -atime (доступ), -mtime (изменение) и -ctime (изменение атрибутов).

Если нет, то посмотри этот параметр в man find:

       -daystart
              Measure times (for -amin, -atime, -cmin, -ctime, -mmin, and -mtime) from the  beginning
              of  today  rather  than from 24 hours ago.  This option only affects tests which appear
              later on the command line.

и да, if [[]]; then…; fi команда find умеет сама делать.

emulek
()
Ответ на: комментарий от emulek

да я в курсе, намек был что одним посиксом не обойдешься, только спецификой конкретной ФС, которую автор не указал.

fornlr ★★★★★
()
Ответ на: комментарий от emulek

Всем спасибо, ответов более, чем достаточно)).

Я просто думал, что есть какой-то православный способ прямо в условии вычислить mtime.

Сейчас у меня сделано примерно так:

VAR=`find ./ -newermt 2014-08-25 ! -newermt 2014-08-26 -print`

if ! [[ -z $VAR ]]
    then ...
fi

и да, if [[]]; then…; fi команда find умеет сама делать.

подробнее в man find ?

tetramin
() автор топика
Ответ на: комментарий от tetramin

дык что «then»? Что ты хочешь сделать? Ну вот и впиши ЭТО в -exec.

Правда срабатывает хорошо только для одной команды, несколько команд сложно обворачивать, проще составить список, и скормитьего циклу, типа

while read fn; do echo "'$fn'"; done < <(find)

(примечание: пробелы и прочее работает, а вот перевод строки в имени файла — увы).

emulek
()
Ответ на: комментарий от tetramin

ext4

ну я смотрел несколько месяцев назад, само поле «день рождения» было, но не работало. Можно попробовать включить ext4dev, отформатировав ФС командой mkfs.ext4 -E test_fs

Для этого конечно нужно новое ядро(какое именно — не знаю).

emulek
()
Ответ на: комментарий от emulek

Не-не! Для моей задачи вполне хватит и mtime )).

дык что «then»? Что ты хочешь сделать?

Я хочу НЕ делать)

VAR=`find ./ -newermt 2014-08-25 ! -newermt 2014-08-26 -print`

if ! [[ -z $VAR ]]
    then echo "Бэкап есть. Выходим!"
    exit 0
fi

Это только часть скрипта. Если за сегодня есть уже копия - можно не делать бэкап. Запускать буду по крону ночью, так что проверяю наличие и (mtime == сегодня).

Спрашивается - если по крону, нафига тогда проверять? Да просто лишняя проверка не помешает, т. к. я собираюсь всё сильно усложнить, лучше сразу нормально сделать. Да и потом, если в логах этого скрипта я увижу какие-то ошибки, чтобы не запускать отдельный файл (у меня как в apache или nginx папка типа sites-enabled) - удалю «плохой» неудавшийся бэкап и запущу весь скрипт.

tetramin
() автор топика
Ответ на: комментарий от tetramin

есть ещё вариант:

TS_BACKUP=$(stat -c%Y $BACKUP_NAME) # время в секундах от нуля, до создания бекапа
TS_NOW=$(date +%s) # время в секундах от нуля
if (( TS_NOW-TS_BACKUP > 86400 )); then
    # пора делать новый бекап, старый устарел
fi

удалю «плохой» неудавшийся бэкап и запущу весь скрипт.

угу. Можно временно поставить в crontab каждую минуту делать (* * * * *).

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.