Я использую inotifywait для копирования файлов и их сборки. Но как заставить его копировать все измененные файлы и строить один раз? Простой скрипт будет создавать 3 раза для каждого измененного файла (что-то делать с временными файлами при сохранении?)

inotifywait --event modify -m -r -q --format '%w%f' "/home/$1/src/$2"  | while read filename event
do
cp -f "$filename" "$TARGET_DIR"
make all

Я могу заставить его построить один раз, и это работает, если я изменяю один файл за раз, но если вы меняете более одного файла за раз, то перед сборкой копируется только первый.

LASTCALLED=$(date +%s)
inotifywait --event modify -m -r -q --format '%w%f' "/home/$1/src/$2"  | while read filename event
do
   cp -f "$filename" "$TARGET_DIR"
   if [[ $(($(date +%s)-$LASTCALLED)) -gt 5 ]]; then
      make all
   LASTCALLED=$(date +%s)

Есть ли простой способ проверить, выполняется ли цикл inotifywait перед сборкой?

0
Holtorf 4 Мар 2020 в 23:03

2 ответа

Вы можете позволить inotifywait сообщить вам об одном изменении, а затем позволить rsync забрать остальные.

inotifywait --event modify -m -r -q "$SOURCE_PATH"  | while read filename event
do
   rsync [flags] "$SOURCE_PATH" "$TARGET_DIR"
   make all
1
Eduardo Trápani 4 Мар 2020 в 23:13
Это лучше, чем то, что было у меня, но мне все равно нужно дважды изменить файлы. inotifywait заметит, что файл вот-вот будет обновлен, поэтому он выполнит rsync файлов и создаст до того, как какой-либо из файлов будет скопирован.
 – 
Holtorf
6 Мар 2020 в 01:26

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

LASTCALLED=$(date +%s)
inotifywait --event modify -m -r -q --format '%w%f' "/home/$1/src/$2"  | while read filename event
do
   cp -f "$filename" "$TARGET_DIR"
   if [[ $(($(date +%s)-$LASTCALLED)) -gt 5 ]]; then
      ( sleep 1; make all ) &
   LASTCALLED=$(date +%s)
0
Holtorf 6 Мар 2020 в 02:18