Подтвердить что ты не робот

Как определить, если файл старше 30 минут из/bin/sh?

Как мне написать скрипт для определения, если файл старше 30 минут в /bin/sh?

К сожалению, в системе нет команды stat. Это старая система Unix, http://en.wikipedia.org/wiki/Interactive_Unix

Perl, к сожалению, не установлен в системе, и клиент не хочет устанавливать его, и ничего больше.

4b9b3361

Ответ 1

Здесь один из способов: find.

if test "`find file -mmin +30`"

Команда find должна быть указана в случае, если файл содержит пробелы или специальные символы.

Ответ 2

Ниже приводится возраст файла в секундах:

echo $(( `date +%s` - `stat -L --format %Y $filename` ))

что означает, что это должно дать значение true/false (1/0) для файлов старше 30 минут:

echo $(( (`date +%s` - `stat -L --format %Y $filename`) > (30*60) ))

30*60 - 60 секунд в минуту, не делайте предварительный расчет, пусть CPU выполняет вашу работу!

Ответ 3

Если вы пишете sh script, наиболее полезным способом является использование test с уже упомянутым трюком статистики:

if [ `stat --format=%Y $file` -le $(( `date +%s` - 1800 )) ]; then 
    do stuff with your 30-minutes-old $file
fi

Обратите внимание, что [ является символической ссылкой (или иным образом эквивалентной) на test; см. man test, но имейте в виду, что test и [ также являются bash встроенными и, следовательно, могут иметь несколько другое поведение. (Также обратите внимание на командную команду [[ bash).

Ответ 4

Хорошо, нет статистики и искалеченной находки. Здесь ваши альтернативы:

Скомпилируйте GNU coreutils, чтобы получить достойную находку (и множество других удобных команд). Возможно, у вас уже есть это как gfind.

Возможно, вы можете использовать date, чтобы получить время изменения файла, если -r работает?

(`date +%s` - `date -r $file +%s`) > (30*60)

В качестве альтернативы используйте сравнение -nt, чтобы выбрать, какой файл является более новым, проблема с файлом с модным временем 30 минут в прошлом. touch обычно может это делать, но все ставки не учитываются в том, что доступно.

touch -d '30 minutes ago' 30_minutes_ago
if [ your_file -ot 30_minutes_ago ]; then
    ...do stuff...
fi

И, наконец, посмотрите, доступен ли Perl, а не борется с тем, кто знает, какие версии утилит оболочки.

use File::stat;
print "Yes" if (time - stat("yourfile")->mtime) > 60*30;

Ответ 5

Для таких, как я, кто не любит обратные тики, на основе ответа @slebetman:

echo $(( $(date +%s) - $(stat -L --format %Y $filename) > (30*60) ))

Ответ 6

Вы можете сделать это, сравнив файл ссылки, который вы создали с отметкой времени тридцать минут назад.

Сначала создайте файл сравнения, введя

touch -t YYYYMMDDhhmm.ss /tmp/thirty_minutes_ago

заменив метку времени значением тридцать минут назад. Вы можете автоматизировать этот шаг с помощью тривиального лайнера в Perl.

Затем используйте find более новый оператор, чтобы соответствовать старым файлам, отменив оператор поиска

find . \! -newer /tmp/thirty_minutes_ago -print

Ответ 7

Что вы имеете в виду старше 30 минут: изменено более 30 минут назад или создано более 30 минут назад? Надеюсь, это первое, поскольку ответы до сих пор верны для этой интерпретации. В последнем случае у вас есть проблемы, так как файловые системы unix не отслеживают время создания файла. (Атрибут файла ctime записывается при последнем изменении содержимого inode, т.е. Что-то вроде chmod или chown).

Если вам действительно нужно знать, был ли файл создан более 30 минут назад, вам придется либо повторно сканировать соответствующую часть файловой системы с помощью чего-то вроде find, либо использовать что-то зависящее от платформы, например linux inotify.

Ответ 8

#!/usr/bin/ksh
## this script creates a new timer file every minute and renames all the previously created timer files and then executes whatever script you need which can now use the timer files to compare against with a find.  The script is designed to always be running on the server.  The first time the script is executed it will remove the timer files and it will take an hour to rebuild them (assuming you want 60 minutes of timer files)

set -x

# if the server is rebooted for any reason or this scripts stops we must rebuild the timer files from scratch
find /yourpath/timer -type f -exec rm {} \;

while [ 1 ]
do
COUNTER=60
COUNTER2=60
cd /yourpath/timer
while [ COUNTER -gt 1 ]
do
  COUNTER2=`expr $COUNTER - 1`
  echo COUNTER=$COUNTER
  echo COUNTER2=$COUNTER2
  if [  -f timer-minutes-$COUNTER2 ]
    then
       mv timer-minutes-$COUNTER2 timer-minutes-$COUNTER
       COUNTER=`expr $COUNTER - 1`
  else
     touch timer-minutes-$COUNTER2
  fi
done

touch timer-minutes-1
sleep 60

#this will check to see if the files have been fully updated after a server restart
COUNT=`find . ! -newer timer-minutes-30 -type f | wc -l | awk '{print $1}'`
if [ $COUNT -eq 1  ]
   then
     # execute whatever scripts at this point
fi

done

Ответ 9

Вы можете использовать команду find.
Например, для поиска файлов в текущем каталоге, старше 30 минут:

find . -type f -mmin +30 

Вы можете прочитать команду найти ЗДЕСЬ

Ответ 10

if [[ "$(date --rfc-3339=ns -r /tmp/targetFile)" < "$(date --rfc-3339=ns --date '90 minutes ago')" ]] ; then echo "older"; fi

Ответ 11

Вот мой вариант find:

if [ 'find cache/nodes.csv -mmin +10 | egrep '.*'' ]

Поиск всегда возвращает код состояния 0 если это не удается; однако egrep возвращает 1 совпадение не найдено '. Таким образом, эта комбинация проходит, если этот файл старше 10 минут.

Попытайся:

touch /tmp/foo; sleep 61; 
find /tmp/foo -mmin +1  | egrep '.*'; echo $?
find /tmp/foo -mmin +10 | egrep '.*'; echo $?

Должен вывести 0, а затем 1 после пути к файлу.

Моя функция, использующая это:

##  Usage: if isFileOlderThanMinutes "$NODES_FILE_RAW" $NODES_INFO_EXPIRY; then ...
function isFileOlderThanMinutes {
  if [ "" == "$1" ] ; then serr "isFileOlderThanMinutes() usage: isFileOlderThanMinutes <file> <minutes>"; exit; fi
  if [ "" == "$2" ] ; then serr "isFileOlderThanMinutes() usage: isFileOlderThanMinutes <file> <minutes>"; exit; fi
  ##  Does not exist -> "older"
  if [ ! -f "$1" ] ; then return 0; fi
  ##  The file older than $2 is found...
  find "$1" -mmin +$2 | egrep '.*'  > /dev/null 2>&1;
  if [ $? == 0 ] ; then return 0; fi  ## So it is older.
  return 1;  ## Else it not older.
}