Как найти последний журнал для нескольких заданий в AIX и удалить последний

это был просто случай сделать это вместо этого:

cat MYPIPE | node script.js

Наверное, я просто не понимаю, почему это ведет себя иначе, чем

node script.js < MYPIPE
1
13.06.2019, 21:03
2 ответа

Чтобы удалить «последний» (самый высокий -пронумерованный файл журнала «запуска» )для каждого набора заданий и дат, я бы предложил решение на основе ksh93 -, которое может отслеживать самые высокие запуски заданий видны для каждой комбинации, а также список файлов для удаления:

#!/bin/ksh93

typeset -A highestjobruns=()
typeset -A deletions=()

for logfile in *_????????_*.log
do
  base=${logfile%.log}
  run=${base##*_}
  jobdate=${base%_?}
  if [ -z "${highestjobruns[$jobdate]}" ]
  then
        # no job runs found yet, this is it; nothing to delete yet
        highestjobruns[$jobdate]=$run
  else
        # if this file has a higher run number, it's the new target for deletion
        if [ "$run" -gt "${highestjobruns[$jobdate]}" ]
        then
                highestjobruns[$jobdate]=$run
                deletions[$jobdate]=$logfile
        fi
  fi
done
printf 'Would rm: %s\n' "${deletions[@]}"
#rm -- "${deletions[@]}"

Основная идея состоит в том, чтобы перебрать каждый потенциальный файл журнала (настроить подстановочный знак по вкусу; Я требую «что угодно», подчеркивание, шесть цифр, подчеркивание, «что угодно», оканчивающееся на .log), выделяю номер запуска и комбинацию задания и даты, затем задаю несколько вопросов:

  1. Зафиксировали ли мы какие-либо пробеги для этой комбинации задания и даты? Если нет, запишите это и продолжайте. Это означает, что мы не будем удалять одноэлементное задание.
  2. Если мы видели предыдущие запуски этой комбинации работы и даты, является ли запуск, который мы рассматриваем, выше, чем самый высокий, который мы видели до сих пор? Если это так, запишите новый номер запуска и заполните текущий файл как файл, который мы можем удалить.Последующие журналы того же задания и даты могут перезаписать эту запись, поэтому мы будем удалять только один файл журнала для каждого имени задания и даты.

В конце я печатаю примеры rmкоманд для файлов, которые мы хотели бы удалить; закомментируйте это, если хотите, и раскомментируйте саму команду rm, чтобы выполнить удаление.

0
28.01.2020, 00:10

Для таких простых имен файлов, где вы можете гарантировать, что они не будут содержать странных символов, таких как перевод строки, безопасно и удобно анализировать вывод ls. (В общем случае это не рекомендуется .)

Как описано в вашем вопросе, давайте предположим, что мы работаем с файлами, соответствующими этому шаблону, где *, конечно, будет соответствовать «чему угодно»:

Order_created_20190611_*.log
Order_zip_rec_20190611_*.log

Кроме того,для файлов, основанных на сегодняшней дате, вы можете найти «самый последний», например:

# Today's date in YYYYMMDD format
today="$(date +%Y%m%d)"

# Get "ls" to give us the files ordered by date modified (newest first). Pick off the first
newest="$(ls -t "Order_created_${today}_"*".log" | head -n1)"

# Show what we would delete (remove "echo" to action)
echo rm "$newest"

Используя этот принцип, вы можете свернуть это в цикл по нескольким именам файлов:

today="$(date +%Y%m%d)"
for prefix in Order_created Order_zip_rec
do
    newest="$(ls -t "${prefix}_${today}_"*".log" 2>/dev/null | head -n1)"
    [[ -f "$newest" ]] && echo rm "$newest"
done

На что следует обратить внимание

  1. Обычно не следует предполагать, что вы можете разобрать вывод ls. Я сделал это в этом случае, потому что ваши имена файлов хорошо определены (и нет расширений GNU для sortили find)
  2. .
  3. Я отбросил вывод ошибок из lsв случае отсутствия соответствующих файлов
  4. Точно так же я пытаюсь выполнить rm, только если есть файл для удаления
0
28.01.2020, 00:10

Теги

Похожие вопросы