Как выбрать файлы, которые были добавлены в каталог за последние 5 минут — HP-UX

Мне нужно выбрать все файлы, которые были добавлены в определенный каталог за последние 5 минут, и скопировать их в другой каталог. Я использую ОС HP-UX, которая не поддерживает amin, cmin и mmin. В связи с этим я создаю временный файл и буду использовать команду find -newer для сравнения файлов с временным файлом с измененной отметкой времени (5 минут назад). HP-UX не поддерживает параметр -d для команды «touch», поэтому я не могу сделать что-то вроде этого:

touch -d "5 mins ago" temp

Я попытался использовать следующее решение, но получил сообщение об ошибке (недопустимое имя переменной):

TZ=ZZZ0 touch -t "$(TZ=ZZZ0:5 date +%Y%m%d%H%M.%S)" temp

Вопрос. Кто-нибудь знает, как выбрать файлы, добавленные в каталог за последние 5 минут, без необходимости манипулировать меткой времени (минуты, дни, месяцы и т. д.)?

Примечание. Мой скрипт будет запускаться каждые 5 минут, но мне нужно, чтобы решение содержалось в скрипте (т. е. не зависело от того, что он будет запускаться каждые 5 минут). Я не могу жестко запрограммировать временную метку.

Спасибо,

Мэтт


person Marcus Koz    schedule 16.02.2015    source источник
comment
Когда скрипт не работает уже 8 минут, вам все еще нужно только 5 минут? Чтобы получить не скопированные файлы, найдите последний скопированный файл и найдите файлы более новые, чем этот. В противном случае вам нужно вызвать скрипт, который вычисляет метку времени 5 минут назад и использовать ее для касания.   -  person Walter A    schedule 16.02.2015
comment
Решение, не соответствующее вашему примечанию: делайте запись в crontab, касающуюся файла каждые 5 минут/завершайте свой скрипт (который запускается cron?) с помощью сенсорного temp. Может быть, изменить ваши требования?   -  person Walter A    schedule 16.02.2015
comment
Вы действительно используете TZ=ZZZ0 ? Я не признаю это как действительную запись, но я рад узнать что-то новое; -) Удачи.   -  person shellter    schedule 16.02.2015
comment
@shellter Нет, я не использую TZ=ZZZ0. Это было частью потенциального решения, но оно не работает для меня. Я получаю сообщение об ошибке недопустимого имени переменной. Спасибо   -  person Marcus Koz    schedule 16.02.2015
comment
@WalterA Я пытаюсь рассчитать отметку времени (5 минут назад) и использовать касание, как вы указали в своем первом комментарии. Тем не менее, я хотел бы решение для расчета метки времени, которое не заставляет меня иметь дело с переносом часов, дней и месяцев (11:55 -> +5 минут -> 12:00).   -  person Marcus Koz    schedule 16.02.2015
comment
Вам не нужно использовать touch -d. Просто используйте следующую логику: 1) коснитесь temp2 2) засните не менее 1 секунды, так как это степень детализации find. 3) найдите все файлы новее temp и обработайте их 4) mv temp2 temp 5) спите сколько хотите, затем переходите к 1).   -  person Mark Plotnick    schedule 16.02.2015
comment
Я не уверен, что понимаю вашу логику. Скрипт будет запускаться каждые 5 минут (не мой выбор). Не вызовет ли это проблемы со сном в течение этого времени? Кроме того, какое влияние сон оказывает на любые другие запущенные процессы? @МаркПлотник   -  person Marcus Koz    schedule 16.02.2015
comment
Если вы реализуете его, запуская совершенно новый процесс каждые 5 минут вместо того, чтобы спать в течение 5 минут, просто не выполняйте последний шаг, который засыпает. Но вам также необходимо учитывать случай, когда обработка всех файлов занимает более 5 минут. Вы не хотите, чтобы более одного экземпляра вашего скрипта выполнялись одновременно. Вероятно, нужно использовать какую-то блокировку.   -  person Mark Plotnick    schedule 16.02.2015
comment
Я искал длинный скрипт, который нашел где-то со всеми поддерживаемыми вычислениями даты/времени. Теперь я нашел кое-что, что звучит очень просто: blog.fpmurphy.com/2008. /10/ksh93-date-manipulation.html Вам это подходит?   -  person Walter A    schedule 17.02.2015
comment
Спасибо за постоянную помощь. К сожалению, при выполнении этих команд я получаю сообщение об ошибке (printf: Error processing format now). @ВальтерА   -  person Marcus Koz    schedule 17.02.2015
comment
Сначала проверьте stackoverflow.com/questions/6467 / для получения дополнительных возможностей или следуйте моему ответу: поспите 300 секунд, прежде чем делать свое дело. Через 5 минут все должно заработать.   -  person Walter A    schedule 17.02.2015


Ответы (2)


Если ваш скрипт предназначен для запуска каждые 5 минут, может сработать следующее решение:

#!/bin/ksh
TMPFILE=/tmp/$0.$$
touch ${TMPFILE}
sleep 300
find somedir -newer ${TMPFILE} | while read file; do
   something_with_file ${file}
done
rm ${TMPFILE}

Ваш something_with_file должен закончиться через 5 минут, вы не хотите, чтобы разные выполнения вашего скрипта обрабатывали один и тот же файл.
Задержка в 5 минут не должна быть проблемой, поскольку вы запускаете его каждые 5 минут.

person Walter A    schedule 16.02.2015

Я смог получить необходимую мне функциональность, используя следующий блок кода:

# Fill date variables 
date '+%Y %m %d %H %M %S' | read in_Y in_m in_d in_H in_M in_S

# Decrease month count to account for first month being at index 0
((in_m=$in_m-1)) 

# Get current time in seconds since epoch
perl -e "use Time::Local; print timelocal($in_S,$in_M,$in_H,$in_d,$in_m,$in_Y), ;" | read cur_S

# Go back five minutes
((old_S=$cur_S-300))

# Change to required format
perl -e 'use POSIX qw(strftime);\
print scalar(strftime "%Y %m %d %H %M %S", localtime $ARGV[0]), "\n";' $old_S | read Y m d H M S

# Create temp file to act as time reference
touch -amt ${Y}${m}${d}${H}${M}.${S} ${tempFileDest}

cd $testSourceDir

# Find files created in past five minutes
find . -type f -newer temp -name $fileNameFormatTest -exec cp -pf {} $testDestDir \;

Спасибо за помощь!

person Marcus Koz    schedule 20.02.2015
comment
Привет, Мэтт. Принимая во внимание, что я недостаточно знаю perl программирование, можно ли сократить первые строки вашего скрипта, при условии, что perl может выполнять простые арифметические операции как cur_S-300? - person Jdamian; 20.02.2015