需求:目錄 A 新增文件 → 自動複製到目錄 B。新手傾向用 cron 輪詢(如每分鐘 ls 對比),但存在延遲、資源浪費、漏文件風險。
#!/bin/bash
SRC_DIR="/path/to/source"
DEST_DIR="/path/to/dest"
# 確保目標目錄存在
mkdir -p "$DEST_DIR"
# 監聽 close_write(文件寫入關閉)、moved_to(移動進來)事件
inotifywait -m -e close_write,moved_to --format '%f' "$SRC_DIR" | while read FILE; do
# 過濾臨時文件(如 .swp, ~, .tmp)
[[ "$FILE" =~ ^\.|\.swp$|~$|\.tmp$ ]] && continue
cp -p "$SRC_DIR/$FILE" "$DEST_DIR/" && echo "$(date) Copied: $FILE"
done
-m:持續監聽,不退出。-e close_write,moved_to:僅捕獲文件寫入完成、移動入目錄事件,避開 create(文件創建瞬間,內容可能尚未寫入)。--format '%f':僅輸出文件名,便於管道處理。while read 逐行處理,天然串行化,避免並發衝突。nohup ./watch_copy.sh > watch.log 2>&1 & 或配置 systemd 服務實現開機自啟。| 方案 | 優點 | 缺點 |
|---|---|---|
| inotifywait | 實時、低資源、內核級事件驅動 | 需安裝 inotify-tools;網絡文件系統(NFS/SMB)可能不支持 |
| cron + find/rsync | 通用、無依賴 | 有延遲、輪詢開銷、易漏文件 |
| incron | 類 cron 語法、基於 inotify | 配置較繁瑣、調試難 |
| Python watchdog / Go fsnotify | 跨平臺、可嵌入應用 | 需編寫代碼、部署運行時 |
Linux 環境下,**inotifywait 是監聽目錄變化的標準最優解**,幾行腳本即可實現生產級可靠同步。