我正在使用 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)