本文目录导读:

- 使用Python的watchdog库(推荐)
- 使用inotify-tools(Linux)
- 使用Node.js的chokidar
- 使用Shell脚本实现简单监控
- 使用fswatch(跨平台)
- 实用示例:自动备份修改的文件
- 推荐选择
使用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脚本
选择哪种方案取决于您的具体需求、操作系统环境和技术栈偏好。