모든 파일을 복사한 후 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)

관련 정보