inotify
是 Linux 系統中用于監控文件系統事件的一種機制。通過 inotify
,你可以實時監控文件或目錄的變化,如創建、刪除、修改等。以下是如何使用 inotify
進行文件變化檢測的步驟:
首先,你需要安裝 inotify-tools
,這是一個常用的命令行工具集,用于與 inotify
交互。
在 Debian/Ubuntu 系統上,可以使用以下命令安裝:
sudo apt-get update
sudo apt-get install inotify-tools
在 CentOS/RHEL 系統上,可以使用以下命令安裝:
sudo yum install epel-release
sudo yum install inotify-tools
inotifywait
是 inotify-tools
中的一個命令行工具,用于等待并報告文件系統事件。
inotifywait [選項] 目錄
例如,監控當前目錄下的所有文件變化:
inotifywait -m .
-m
:監控模式,持續監控文件系統事件。-r
:遞歸監控子目錄。-e
:指定要監控的事件類型,如 create
、delete
、modify
、move
等。-q
:安靜模式,只輸出事件信息,不顯示其他信息。--format
:自定義輸出格式。監控當前目錄及其子目錄下的所有 .txt
文件的創建、修改和刪除事件:
inotifywait -m -r -e create,modify,delete --format '%w%f %e' --timefmt '%Y-%m-%d %H:%M:%S' .
inotifywatch
是另一個 inotify-tools
中的命令行工具,用于統計文件系統事件。
inotifywatch [選項] 目錄
例如,監控當前目錄下的所有文件變化,并輸出統計信息:
inotifywatch -m -r -e create,modify,delete .
-m
:監控模式,持續監控文件系統事件。-r
:遞歸監控子目錄。-e
:指定要監控的事件類型,如 create
、modify
、delete
、move
等。--timefmt
:自定義時間格式。監控當前目錄及其子目錄下的所有 .txt
文件的創建、修改和刪除事件,并輸出統計信息:
inotifywatch -m -r -e create,modify,delete --timefmt '%Y-%m-%d %H:%M:%S' .
除了命令行工具外,inotify
還提供了編程接口,可以在 C/C++ 程序中使用。你可以使用 libinotify
庫來編寫自定義的文件變化檢測程序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/inotify.h>
#include <unistd.h>
#define EVENT_SIZE ( sizeof (struct inotify_event) )
#define BUF_LEN ( 1024 * ( EVENT_SIZE + 16 ) )
int main(int argc, char **argv) {
int length, i = 0;
int fd;
int wd;
char buffer[BUF_LEN];
fd = inotify_init();
if (fd < 0) {
perror("inotify_init");
}
wd = inotify_add_watch(fd, ".", IN_CREATE | IN_DELETE | IN_MODIFY);
if (wd < 0) {
perror("inotify_add_watch");
}
length = read(fd, buffer, BUF_LEN);
if (length < 0) {
perror("read");
}
while (i < length) {
struct inotify_event *event = (struct inotify_event *) &buffer[i];
if (event->len) {
if (event->mask & IN_CREATE) {
printf("File %s created\n", event->name);
} else if (event->mask & IN_DELETE) {
printf("File %s deleted\n", event->name);
} else if (event->mask & IN_MODIFY) {
printf("File %s modified\n", event->name);
}
}
i += EVENT_SIZE + event->len;
}
(void) inotify_rm_watch(fd, wd);
(void) close(fd);
return 0;
}
編譯并運行該程序:
gcc -o inotify_example inotify_example.c
./inotify_example
通過以上方法,你可以使用 inotify
進行文件變化檢測,無論是通過命令行工具還是編程接口。