面试题答案
一键面试#!/bin/bash
# 设定监控的目录
WATCH_DIR="$1"
if [ -z "$WATCH_DIR" ]; then
echo "Usage: $0 <directory_to_watch>"
exit 1
fi
# 用于存储已变化文件的数组
CHANGED_FILES=()
# 检查当前目录是否是有效的Git仓库
is_git_repo() {
git rev-parse --is-inside-work-tree &> /dev/null
return $?
}
# 处理文件变化
handle_change() {
FILE="$1"
# 检查文件是否在指定目录及其子目录内
if [[ "$FILE" == "$WATCH_DIR"/** ]]; then
CHANGED_FILES+=("$FILE")
# 这里可以设置一个定时器或者事件队列机制,避免频繁提交
# 简单示例:每10秒检查一次并提交
if [ ${#CHANGED_FILES[@]} -gt 0 ]; then
sleep 10
if is_git_repo; then
git add "${CHANGED_FILES[@]}"
TIMESTAMP=$(date +%Y-%m-%d_%H:%M:%S)
COMMIT_MSG="Files changed: ${CHANGED_FILES[*]} at $TIMESTAMP"
git commit -m "$COMMIT_MSG"
CHANGED_FILES=()
else
echo "Not in a valid Git repository. Skipping commit."
fi
fi
fi
}
# 使用inotifywait监控文件变化
inotifywait -mrq --format '%w%f' -e create,delete,modify,move $WATCH_DIR | while read FILE; do
handle_change "$FILE"
done
-
脚本说明:
- 首先,脚本接收一个参数作为要监控的目录
WATCH_DIR
,如果没有提供参数则提示用法并退出。 is_git_repo
函数用于判断当前目录是否是一个有效的Git仓库。handle_change
函数处理文件变化,将变化的文件添加到CHANGED_FILES
数组中,并在一定时间间隔(这里是10秒)后检查是否在有效的Git仓库中,如果是则进行批量提交。- 使用
inotifywait
命令来监控指定目录及其子目录下文件的创建、删除、修改和移动事件,并通过while read
循环处理每个变化事件。
- 首先,脚本接收一个参数作为要监控的目录
-
性能优化:
- 通过使用数组
CHANGED_FILES
存储变化的文件,实现批量操作。 - 设置
sleep 10
,在10秒内收集所有变化的文件,避免文件变化频繁时的重复提交。实际应用中,可以根据需求调整这个时间间隔或者采用更复杂的事件队列机制。
- 通过使用数组