Найти модифицированные файлы в реальном времени?

Забудьте, что я писал раньше, я думал, что вы перемещаете файлы. Думаю, теперь я понимаю его лучше:

sed -r '/isoforms/{\
    N;N;s/(.*Name=)[^;]*(.*Name=)\S*\
    (.*Name=.*Target=)(\S*)(.*)/\
        \1\4\2\4\3\4\5/}'

Я запустил его, и он работает для замены первых двух вхождений "Name=code[0-9_]*" в любом наборе из трех строк, начиная с одной, содержащей "isoforms", на следующую встречающуюся не пробельную последовательность $VALUE из пары ключей "Target=$VALUE".

Я использовал только образец из 20 или около того строк; так что, возможно, он нуждается в настройке. Кроме того, я не уверен, что понимаю проблему суффикса ".[a|b]", о которой вы упоминаете, хотя я уверен, что еще не решил ее. Я вполне уверен, что с чем бы это ни было, с этим можно справиться с помощью теста ветвления или двух. Я попытаюсь объяснить, что означает код:

  • /isoforms/ sed сначала просматривает поток на наличие строки, содержащей эту строку.

  • { Когда она найдена, он начинает выполнять блок кода, расположенный в фигурных скобках. }

  • N;N; sed немедленно считывает следующие две строки ввода в свое пространство шаблонов, так что он может работать с тремя строками одновременно. Если бы в этот момент вы использовали команду "l" для печати пространства шаблонов, вы бы увидели что-то вроде:

    изоформы строка \n ген строка \n цель строка

  • s/search/replace/ команда s инструктирует sed выполнить функцию поиска и замены в текущем пространстве шаблонов.

  • (regex) каждая паренс-пара в поле поиска регулярного выражения соответствует обратной ссылке в поле замены. Некоторые сокращения, которые я использовал:

    • [^;]* следующая встречающаяся самая длинная последовательность символов, не включающая точку с запятой.

    • \S* следующая по длине последовательность символов, не включающая пробелы.

  • \NUM sed увеличивает заменяющие обратные ссылки в порядке их определения в поле поиска. Краткое описание этого конкретного поиска:

    • \1 sed ищет строку "Name=" и, найдя три в пространстве шаблона и три, указанные в regex, сопоставляет все до первого результата включительно.

    • DISCARDED sed отбрасывает самую длинную последовательность символов, которую он может найти после \1, не включая точку с запятой.

    • \2 Аналогично \1, но для второго результата "Name=".

    • DISCARDED sed отбрасывает следующую встречающуюся последовательность символов, пока не встретит пробел.

    • \3 sed подбирает "Name=" и все остальное до "Target=" включительно

    • \4 sed подбирает следующую последовательность символов, пока не встретится пробел

    • \5 sed подбирает то, что осталось от строки 3

  • Чтобы собрать все вместе, я просто заменил секции DISCARDED на \4 следующим образом:

    \1\4\2\4\3\4\5

INPUT:

ID=gene09491;Name=code_229633_138;isoforms=1
ID=mRNA10690;Parent=gene09491;Name=code_229633_138
ID=exon26252;Parent=mRNA10690;Name=code_229633_138;Target=R77_09738T0 1 411 +

ID=gene09513;Name=code_230519_10;isoforms=1
ID=mRNA10715;Parent=gene09513;Name=code_230519_10
ID=exon26311;Parent=mRNA10715;Name=code_230519_10;Target=R77_04813T0 1 59 + ID=exon26312;Parent=mRNA10715;Name=code_230519_10;Target=R77_04813T0 60 186 +

OUTPUT:

ID=gene09491;Name=R77_09738T0;isoforms=1
ID=mRNA10690;Parent=gene09491;Name=R77_09738T0
ID=exon26252;Parent=mRNA10690;Name=code_229633_138;Target=R77_09738T0 1 411 +

ID=gene09513;Name=R77_04813T0;isoforms=1
ID=mRNA10715;Parent=gene09513;Name=R77_04813T0
ID=exon26311;Parent=mRNA10715;Name=code_230519_10;Target=R77_04813T0 1 59 +
ID=exon26312;Parent=mRNA10715;Name=code_230519_10;Target=R77_04813T0 60 186 +

3
21.11.2018, 21:17
1 ответ

Установить и настроить incrontab.

incron is a daemon which monitors filesystem events and executes commands defined in system and user tables.

Добавьте пользователя под /etc/incron.allow(, разрешите пользователю использовать incrontab), используйте incrontab -eдля редактирования файла.

Использование:

path mask command

path= путь к файлу

mask= см.man inotify | less +/'inotify events'

command= команда для выполнения, в вашем случае это может быть просто сообщение, позволяющее отфильтровать результаты вашего syslog, чтобы узнать точное время модификации файла.

Например, :Для мониторинга fileиспользуйте :

.
/path/to/file IN_MODIFY "message: your file is accessed"

Если доступ к файлу осуществляется путем модификации, вы найдете сообщение в разделе /var/log/syslogили введитеjounalctl -xe

Пример вывода:

# grep "message: your" /var/log/syslog

Nov 22 10:05:04 hostname incrond[2263]: (USER) CMD ("message: your file is accessed")

Редактировать

Можно отслеживать все файлы в определенной папке. Это пример сообщения, позволяющего вам перечислить все файлы по мере их обновления :

.
path/to/folder IN_MODIFY echo "$$ $@ $# $% $&"

The command may contain these wildcards:

$$ - a dollar sign
$@ - the watched filesystem path (see above example)
$# - the event-related file name
$% - the event flags (textually)
$& - the event flags (numerically)

Archlinux :инкрон

Как использовать Incron для мониторинга важных файлов и папок

2
27.01.2020, 21:24

Теги

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