Вы можете создать цикл, который проверяет текущее время и пропускает события, идентичные (или, в более общем смысле, похожие способом, который вы можете определить )для предыдущего события. В bash, ksh или zsh следующий простой цикл пропускает повторяющиеся события в течение 10 -секунд:
inotifywait -m … | {
previous_SECONDS=0
previous_event=
while IFS= read -r event; do
if [[ "$event" = "$previous_event" && $SECONDS <= $previous_SECONDS + 10 ]]; then
continue
fi
previous_SECONDS=$SECONDS previous_event=$event
"$post_upload" "$event"
done
}
Оболочки не подходят для высокопроизводительной -обработки текста, поэтому, возможно, лучше использовать другой инструмент. Вы можете использовать awk, который по историческим причинам имеет очень странный способ выставить время (как количество секунд, прошедших с тех пор, как эпоха ):вызов srand()
возвращает время предыдущего вызова srand()
.
inotifywait -m … | awk '
{srand(); current_time = srand()}
$0 == previous_event && current_time <= previous_time + 10 {
system(ENVIRON["post_upload"])
}
{previous_event = $0; previous_time = current_time}
'
Если вам действительно не нужна переносимость, я бы отказался от этого и использовал более продвинутый язык сценариев, такой как Perl, Python или Ruby. Эти языки имеют интерфейс для inotify, поэтому нет необходимости вызывать inotifywait
и выполнять какой-либо анализ текста.
Изменение моего zstyle
на следующее сработало отлично:
zstyle ':completion:*:(ssh|scp|ftp|sftp):*' hosts $hosts
zstyle ':completion:*:(ssh|scp|ftp|sftp):*' users $users