Как получить разницу между двумя датами в Linux?

Чтобы отправить электронное письмо на foo@bar.com, если файл содержит присвоение чего-либо, отличного от -нуля, чему-либо:

  1. Отфильтровать все строки с назначениями. Это можно сделать с помощьюgrep '='(или `grep 'count=', если вам нужна более конкретная информация ).
  2. Удалить строки с одиночными нулями. Это можно сделать с помощьюgrep -v -w '0'(-wдля сопоставления только полных слов, то есть не 10в данном случае ).
  3. Закон о результате.
if grep '=' output.txt | grep -q -v -w '0'; then
    grep '=' output.txt | grep -v -w '0' | mailx -s "Check this out!" foo@bar.com
fi

Для данных в вопросе будет отправлено электронное письмо, содержащее

GHI_count=            56

Если вам кажется ненужным запускать четыре grep для этого:

tmpfile=$(mktemp)
grep '=' output.txt | grep -v -w '0' >"$tmpfile"

if [ -s "$tmpfile" ]; then
    mailx -s "Check this out!" foo@bar.com <"$tmpfile"
fi

rm -f "$tmpfile"

Тест -sбудет верным, если файл существует и его размер больше нуля.

1
19.11.2019, 12:39
2 ответа

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

В этих обстоятельствах вы можете объединить операцию условного поиска и удаления файлов в одну команду, используя здесь find(, предполагая GNU findили совместимость ), как в

find /start/of/logfile/dir/structure ! -type d -daystart -mtime +5 -delete

, который при запуске в 2019 -11 -16 22 :54 :12 по местному времени удалит не -файлы каталога, время последнего изменения которых до 2019 -11 -11 00 :00 :00 (значит файлы от 10-го и старше ).

Обратите внимание, что опция -daystartэтой команды findдолжна обеспечивать желаемое поведение. Если вам нужно ограничить операцию определенными частями имени файла, вам придется добавить-name <pattern>(cf. документация к GNUfind).

Также обратите внимание, что в зависимости от версии find, установленной на вашем компьютере, операция -deleteможет быть недоступна , поэтому вам, возможно, придется использовать вместо нее -exec rm {} \;.

1
27.01.2020, 23:40

man find, -время:

...so to match -atime +1, a file has to have been accessed at least two days ago.

Опция -daystartизменяет интерпретацию:

-daystart
 Measure times (for -amin, -atime, -cmin, -ctime, -mmin, and  -mtime)
 from the beginning of today rather than from 24 hours ago.  

touch -d '2019-11-19 0800' thismorningпозволяет легко создавать тестовые файлы:

]# find -name '*n*g*' -daystart -mtime 0 -ls 
      Nov 19 08:00./thismorning
]# find -name '*n*g*' -daystart -mtime 1 -ls 
      Nov 18 22:30./lastnight
      Nov 18 08:30./lastmorning
]# find -name '*n*g*'  -mtime 0 -ls 
      Nov 18 22:30./lastnight
      Nov 19 08:00./thismorning
]# find -name '*n*g*'  -mtime 1 -ls 
      Nov 17 22:00./lastlastnight
      Nov 18 08:30./lastmorning

(Я вырезал -поля вывода ls --оставил только даты и имена файлов)

]# find -name '*n*g*'; date         
./lastnight
./thismorning
./lastlastnight
./lastmorning
Tue Nov 19 10:34:33 UTC 2019
]# find -name '*n*g*' -daystart -mtime 2 -ls 
   Nov 17 22:00./lastlastnight
]# 

...потому что вы перепутали календарные дни и 24-часовые -периоды в своем ОП. Иногда мы хотим этого, иногда этого.

Почему секунды с начала эпохи?

Если вы хотите узнать, как долго что-то длилось, т. е. разницу двух дат, в нашем календаре есть эти нарушения (месяцев ). Так что либо используйте костяшки пальцев, знайте об императорах Юлии и Августе, либо применяйте грубую силу за секунды.

От 30.7. до 1,9. на три дня больше, чем 30.1. до 1.3., и это даже зависит от високосных лет.

today, 5:30 pmи tomorrow 6:00 amявляются

  • разные дни (по календарю)
  • всего полдня (день = продолжительность 24x60x60 секунд)

Из даты истечения срока _я вычитаю, что вы хотите подсчитать прошедшие 24-часовые периоды. Это означает, что в 1 :00 большая часть «вчера» не затрагивается.

Я проверил и исправил команду date

]# date -d "-1 day" +%s
1574003538
]# date -d "-0 day" +%s
1574089945

Разница 86407 т.е. 24x60x60.

(И если кто-нибудь спросит меня :"Что ты делал в date -d @1574089945?" Я могу сказать :"Я редактировал команду семь секунд ")


]# find. -atime 1
./here.sh
]# find. -atime +0 -atime -2
./here.sh
]# ls -l here.sh 
-rw-r--r-- 1 root root 154 Nov 16 21:37 here.sh

Сейчас Nov 18 16:43. Таким образом, между ними есть один полный 24-часовой период.

0
27.01.2020, 23:40

Теги

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