监控文件变化的脚本如何编写

wen 实用脚本 1

本文目录导读:

监控文件变化的脚本如何编写

  1. 使用Python的watchdog库(推荐)
  2. 使用inotify-tools(Linux)
  3. 使用Node.js的chokidar
  4. 使用Shell脚本实现简单监控
  5. 使用fswatch(跨平台)
  6. 实用示例:自动备份修改的文件
  7. 推荐选择

使用Python的watchdog库(推荐)

安装

pip install watchdog

示例脚本

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if not event.is_directory:
            print(f"文件被修改: {event.src_path}")
    def on_created(self, event):
        print(f"文件被创建: {event.src_path}")
    def on_deleted(self, event):
        print(f"文件被删除: {event.src_path}")
    def on_moved(self, event):
        print(f"文件被移动: {event.src_path} -> {event.dest_path}")
def monitor_directory(path):
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()
if __name__ == "__main__":
    monitor_directory("./watch_folder")  # 监控当前目录下的watch_folder文件夹

使用inotify-tools(Linux)

安装

sudo apt-get install inotify-tools  # Ubuntu/Debian
sudo yum install inotify-tools      # CentOS/RHEL

示例脚本

#!/bin/bash
# 监控文件变化
inotifywait -m -r -e modify,create,delete,move /path/to/watch |
while read path action file; do
    echo "文件: $file"
    echo "操作: $action"
    echo "路径: $path"
    echo "---"
    # 执行自定义操作
    case "$action" in
        "MODIFY")
            echo "文件被修改: $file"
            ;;
        "CREATE")
            echo "文件被创建: $file"
            ;;
        "DELETE")
            echo "文件被删除: $file"
            ;;
    esac
done

使用Node.js的chokidar

安装

npm install chokidar

示例脚本

const chokidar = require('chokidar');
// 初始化监控
const watcher = chokidar.watch('./watch_folder', {
    ignored: /(^|[\/\\])\../, // 忽略隐藏文件
    persistent: true,
    ignoreInitial: true
});
// 事件监听
watcher
    .on('add', path => console.log(`文件添加: ${path}`))
    .on('change', path => console.log(`文件修改: ${path}`))
    .on('unlink', path => console.log(`文件删除: ${path}`))
    .on('addDir', path => console.log(`目录添加: ${path}`))
    .on('unlinkDir', path => console.log(`目录删除: ${path}`))
    .on('error', error => console.error(`监控错误: ${error}`))
    .on('ready', () => console.log('监控已就绪'));
console.log('正在监控文件夹变化...');

使用Shell脚本实现简单监控

#!/bin/bash
watch_dir="/path/to/watch"
previous_file=""
while true; do
    # 获取目录下所有文件的最新修改时间
    current_status=$(find "$watch_dir" -type f -printf "%T@ %p\n" | sort -n | tail -1)
    if [ "$current_status" != "$previous_file" ]; then
        echo "文件有变化: $(date)"
        echo "$current_status"
        previous_file="$current_status"
        # 这里可以添加自定义操作
        # rsync备份
        # rsync -avz "$watch_dir" user@backup-server:/backup/
    fi
    sleep 5  # 每5秒检查一次
done

使用fswatch(跨平台)

安装

# macOS
brew install fswatch
# Linux
sudo apt-get install fswatch
# 或从源码编译

示例脚本

#!/bin/bash
fswatch -o /path/to/watch | while read change; do
    echo "检测到文件变化: $(date)"
    echo "变化数量: $change"
    # 获取具体变化的文件
    fswatch -0 /path/to/watch | while read -d "" event; do
        echo "文件: $event"
    done
done

实用示例:自动备份修改的文件

import time
import shutil
import os
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from datetime import datetime
class BackupHandler(FileSystemEventHandler):
    def __init__(self, backup_dir):
        self.backup_dir = backup_dir
        if not os.path.exists(backup_dir):
            os.makedirs(backup_dir)
    def on_modified(self, event):
        if not event.is_directory:
            # 创建备份文件名(包含时间戳)
            timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
            filename = os.path.basename(event.src_path)
            backup_filename = f"{timestamp}_{filename}"
            backup_path = os.path.join(self.backup_dir, backup_filename)
            try:
                shutil.copy2(event.src_path, backup_path)
                print(f"备份文件: {event.src_path} -> {backup_path}")
            except Exception as e:
                print(f"备份失败: {e}")
# 使用示例
if __name__ == "__main__":
    watch_path = "./important_files"
    backup_path = "./backups"
    observer = Observer()
    handler = BackupHandler(backup_path)
    observer.schedule(handler, watch_path, recursive=True)
    observer.start()
    print(f"开始监控: {watch_path}")
    print(f"备份目录: {backup_path}")
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
        print("\n监控已停止")
    observer.join()

推荐选择

  • 跨平台且简单:Python + watchdog
  • Linux系统高效:inotify-tools
  • Web开发环境:Node.js + chokidar
  • 简单快速部署:Shell脚本

选择哪种方案取决于您的具体需求、操作系统环境和技术栈偏好。

抱歉,评论功能暂时关闭!