私はファイルをコピーしてビルドするために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
一度ビルドでき、一度に1つのファイルを変更すると機能しますが、一度に複数のファイルを変更すると、ビルド前に最初のファイルのみがコピーされます。
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)