我想创建一个脚本,该脚本将记录一天中对该目录的每次访问或该目录中的任何文件,为此,我使用 inotifywait,但即使我格式化了输出,我也不喜欢它,我需要用户也访问/修改了文件。我想以表格格式打印它。像这样的东西:
TIME USER FILE EVENT
%mm:%HH PM/am root /home/root/x Accesed(or anything the inotifywait gives)
我尝试了这样的事情:
#!/bin/sh
watchedDir=$1
logFileName="$(date +'%d.%m.%Y').log"
iwait() {
inotifywait -r -m --timefmt "%Y/%m/%d %H:%M:%S" --format "%T;%w%f;%e" $watchedDir >> "$PWD/.$logFileName.tmp"
}
write_to_file() {
while true; do
last_entry=$(tail -n 1 "$PWD/$logFileName.tmp")
time=$(tail -n 1 "$PWD/$logFileName.tmp" | cut -f1 -d';')
user=$(stat $last_entry --format="%U")
file=$(tail -n 1 "$PWD/$logFileName.tmp" | cut -f2 -d';')
event=$(tail -n 1 "$PWD/$logFileName.tmp" | cut -f3 -d';')
awk -v time="$time" -v user="$user" -v file="$file" -v event="$event" 'BEGIN {printf("%s %8s %8s %8s \n" ,"Time", "User", "File", "Event")}
{printf("%s %s %s %s\n", time, user, file, event)}' >> "$PWD/.$logFileName.tmp"
done
}
if [ "$(realpath $watchedDir)" != "$PWD" ]
then
iwait &
write_to_file &
wait
fi
我还发现,如果我尝试查看当前目录并将文件重定向到当前目录,它将淹没输出......所以我尝试使用它来克服它if
。
我怎么能做这样的事情?
替代解决方案使用
iwatch
log.sh
结果日志示例:
要更多地控制制表,试试这个
输出将如下所示:
格式“-%X.Yf”:
-
左对齐X
最小宽度(焊盘)Y
最大宽度(修剪)\t
&\n
转义字符 TAB & NEWLINE