所有文件复制完毕后使用inotifywait进行构建

所有文件复制完毕后使用inotifywait进行构建

我正在使用 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 是否已完成循环?

答案1

你可以让inotifywait你知道改变,然后让我们rsync拿起剩下的。

inotifywait --event modify -m -r -q "$SOURCE_PATH"  | while read filename event
do
   rsync [flags] "$SOURCE_PATH" "$TARGET_DIR"
   make all

答案2

这并不理想,但最有效的方法是在一个单独的线程中延迟构建,以便在构建之前所有文件都有时间被复制。

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)

相关内容