背景
我的用例是监视一个名为 wavs/ 的目录,并在文件关闭时执行 bash 操作(对于初学者,我将使用修改、删除、创建)。每次收到事件时,我都会调用特定于该事件的 bash 函数。
我不需要将参数传递给 shell 脚本来进行测试。我将为每个 inotifywait 事件调用不同的脚本。如上所述,第一个测试是修改、删除、创建事件。
这是我关注的资源,我假设语法在 21-24 之间发生了变化。提前谢谢您!
https://www.baeldung.com/linux/monitor-changes-directory-tree
Bash脚本
#!/bin/bash
file_removed() {
xmessage "$2 was removed from $1" &
}
file_modified() {
TIMESTAMP=`date`
echo "[$TIMESTAMP]: The file $1$2 was modified" >> monitor_log
}
file_created() {
TIMESTAMP=`date`
echo "[$TIMESTAMP]: The file $1$2 was created" >> monitor_log
}
inotifywait -q -m -r -e modify,delete,create $1 | while read DIRECTORY EVENT FILE; do
case $EVENT in
MODIFY*)
file_modified "$DIRECTORY" "$FILE"
;;
CREATE*)
file_created "$DIRECTORY" "$FILE"
;;
DELETE*)
file_removed "$DIRECTORY" "$FILE"
;;
esac
done
错误
./monitro_file.sh: line 4: file_modified: command not found
./monitro_file.sh: line 4: file_modified: command not found
# repeats several times
系统
Raspberry Pii
Linux ******* 6.5.0-1010-raspi #13-Ubuntu SMP PREEMPT_DYNAMIC Thu Jan 18 09:08:04 UTC 2024 aarch64 aarch64 aarch64 GNU/Linux
GNU bash, version 5.2.15(1)-release (aarch64-unknown-linux-gnu)
创建测试文件
arecord -r 16000 -D plughw:1,0 wavs/test.wav
召唤
./monitro_file.sh wavs &
tail -f monitor_log
我认为它可能与inotifywait/arm/bash有一些细微差别,所以我大大简化了脚本,这通过了我的接受标准:
inotifywait -r -m -e close "$1" |
while read file_path file_event file_name; do
echo ${file_path}${file_name} event: ${file_event}
./afterchange.sh ${file_path} ${file_name} ${file_event}
done
召唤
./watch_wavs.sh wavs