나는 파일을 복사하고 빌드하기 위해 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)