inotify 是 Linux 系统中一个用于监控文件系统事件的接口。通过 inotify,你可以实时地监控文件或目录的变化,如创建、删除、修改等,并根据这些事件执行相应的操作,例如同步文件。
以下是使用 inotify 实现文件同步的基本步骤:
首先,确保你的系统中安装了 inotify-tools 和相关的开发库。在大多数 Linux 发行版中,可以使用包管理器进行安装。
# 在 Debian/Ubuntu 上
sudo apt-get install inotify-tools libinotify-dev
# 在 CentOS/RHEL 上
sudo yum install inotify-tools libinotify-devel
# 在 Fedora 上
sudo dnf install inotify-tools libinotify-devel
下面是一个简单的 Bash 脚本示例,使用 inotifywait 监控源目录中的文件变化,并将变化的文件同步到目标目录。
#!/bin/bash
# 源目录和目标目录
SOURCE_DIR="/path/to/source"
TARGET_DIR="/path/to/target"
# 创建目标目录(如果不存在)
mkdir -p "$TARGET_DIR"
# 使用 inotifywait 监控源目录
inotifywait -m -r -e create,delete,modify --format '%w%f' "$SOURCE_DIR" | while read FILE
do
    # 获取相对路径
    RELATIVE_PATH="${FILE#$SOURCE_DIR/}"
    
    # 构建目标文件的完整路径
    TARGET_FILE="$TARGET_DIR/$RELATIVE_PATH"
    
    # 确保目标目录存在
    mkdir -p "$(dirname "$TARGET_FILE")"
    
    # 根据事件类型执行同步操作
    case "$FILE" in
        *create*)
            cp --parents "$FILE" "$TARGET_FILE"
            echo "Created: $TARGET_FILE"
            ;;
        *delete*)
            rm -f "$TARGET_FILE"
            echo "Deleted: $TARGET_FILE"
            ;;
        *modify*)
            cp --parents "$FILE" "$TARGET_FILE"
            echo "Modified: $TARGET_FILE"
            ;;
    esac
done
保存上述脚本为 sync_with_inotify.sh,然后赋予执行权限并运行:
chmod +x sync_with_inotify.sh
./sync_with_inotify.sh
inotify 可能会遇到性能瓶颈。可以考虑使用更高级的工具或优化策略。如果你需要更复杂的同步逻辑,可以考虑使用 rsync 结合 inotify。例如,可以使用 inotifywait 监控文件变化,然后触发 rsync 命令进行同步。
#!/bin/bash
SOURCE_DIR="/path/to/source"
TARGET_DIR="/path/to/target"
# 创建目标目录(如果不存在)
mkdir -p "$TARGET_DIR"
# 使用 inotifywait 监控源目录
inotifywait -m -r -e create,delete,modify --format '%w%f' "$SOURCE_DIR" | while read FILE
do
    # 获取相对路径
    RELATIVE_PATH="${FILE#$SOURCE_DIR/}"
    
    # 构建目标文件的完整路径
    TARGET_FILE="$TARGET_DIR/$RELATIVE_PATH"
    
    # 确保目标目录存在
    mkdir -p "$(dirname "$TARGET_FILE")"
    
    # 使用 rsync 进行同步
    rsync -av --delete "$SOURCE_DIR/" "$TARGET_DIR/"
    
    echo "Synced: $TARGET_FILE"
done
通过这种方式,你可以实现更高效和可靠的文件同步。