это был просто случай сделать это вместо этого:
cat MYPIPE | node script.js
Наверное, я просто не понимаю, почему это ведет себя иначе, чем
node script.js < MYPIPE
Чтобы удалить «последний» (самый высокий -пронумерованный файл журнала «запуска» )для каждого набора заданий и дат, я бы предложил решение на основе 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
), выделяю номер запуска и комбинацию задания и даты, затем задаю несколько вопросов:
В конце я печатаю примеры rm
команд для файлов, которые мы хотели бы удалить; закомментируйте это, если хотите, и раскомментируйте саму команду rm
, чтобы выполнить удаление.
Для таких простых имен файлов, где вы можете гарантировать, что они не будут содержать странных символов, таких как перевод строки, безопасно и удобно анализировать вывод 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
На что следует обратить внимание
ls
. Я сделал это в этом случае, потому что ваши имена файлов хорошо определены (и нет расширений GNU для sort
или find
)ls
в случае отсутствия соответствующих файлов rm
, только если есть файл для удаления