首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Shell 腳本監聽目錄新增文件並自動複製:inotifywait 實戰方案

     編輯:程式設計疑難解答

需求分析

需求:目錄 A 新增文件 → 自動複製到目錄 B。新手傾向用 cron 輪詢(如每分鐘 ls 對比),但存在延遲、資源浪費、漏文件風險。

最佳方案:inotifywait (Linux 內核 inotify 事件通知)

#!/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 是監聽目錄變化的標準最優解**,幾行腳本即可實現生產級可靠同步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved