linux

如何用inotify实现文件同步

小樊
37
2025-06-21 07:51:47
栏目: 编程语言

inotify 是 Linux 系统中一个用于监控文件系统事件的接口。通过 inotify,你可以实时地监控文件或目录的变化,如创建、删除、修改等,并根据这些事件执行相应的操作,例如同步文件。

以下是使用 inotify 实现文件同步的基本步骤:

1. 安装必要的工具和库

首先,确保你的系统中安装了 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

2. 编写脚本

下面是一个简单的 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

3. 运行脚本

保存上述脚本为 sync_with_inotify.sh,然后赋予执行权限并运行:

chmod +x sync_with_inotify.sh
./sync_with_inotify.sh

4. 注意事项

5. 高级用法

如果你需要更复杂的同步逻辑,可以考虑使用 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

通过这种方式,你可以实现更高效和可靠的文件同步。

0
看了该问题的人还看了