我正在寻找一个小的bash脚本,在启动时,查看任何新创建的文件的目录.如果出现新文件,我希望它的存在触发第二个脚本运行.
我看到这用于触发压缩最近的数字化视频,并将其添加到摄取的镜头日志中.
目前我的代码如下所示:
#!/bin/sh
##VIDSTAT is a global variable coming from a parent script.
##proj is the ingestion directory coming from a parent script
proj=$1
dir="/home/$USER/data/movies/$proj"
dirlist=$(ls $dir)
while { $VIDSTAT -eq 1 }:
do
for mov in $dirlist
do
if [ "$(( $(date +"%s") - $(stat -c "%Y" $mov) ))" -lt "5" ]
then
~/bin/compressNlog.sh $mov
fi
done
done
Run Code Online (Sandbox Code Playgroud)
有没有更容易/更清洁/更少内存密集的方式来做到这一点?
编辑我将改变每个捕获会话的摄取目录.我已相应调整了代码
Sat*_*ish 14
incron怎么样?它触发文件/目录更改命令.
sudo apt-get install incron
Run Code Online (Sandbox Code Playgroud)
例:
<path> <mask> <command>
Run Code Online (Sandbox Code Playgroud)
哪里<path>
可以是目录(意思是目录和/或直接在该目录中的文件(不是该目录的子目录中的文件!))或文件.
<mask>
可以是以下之一:
IN_ACCESS File was accessed (read) (*)
IN_ATTRIB Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
IN_CLOSE_WRITE File opened for writing was closed (*)
IN_CLOSE_NOWRITE File not opened for writing was closed (*)
IN_CREATE File/directory created in watched directory (*)
IN_DELETE File/directory deleted from watched directory (*)
IN_DELETE_SELF Watched file/directory was itself deleted
IN_MODIFY File was modified (*)
IN_MOVE_SELF Watched file/directory was itself moved
IN_MOVED_FROM File moved out of watched directory (*)
IN_MOVED_TO File moved into watched directory (*)
IN_OPEN File was opened (*)
Run Code Online (Sandbox Code Playgroud)
<command>
是事件发生时应该运行的命令.可以在命令规范中使用以下通配符:
$$ dollar sign
$@ watched filesystem path (see above)
$# event-related file name
$% event flags (textually)
$& event flags (numerically)
Run Code Online (Sandbox Code Playgroud)
如果你看一个目录,那么$ @保存目录路径,$#保存触发事件的文件.如果你看一个文件,那么$ @保存文件的完整路径,$#为空.
工作实例:
$sudo echo spatel > /etc/incron.allow
$sudo echo root > /etc/incron.allow
Run Code Online (Sandbox Code Playgroud)
启动守护程序:
$sudo /etc/init.d/incrond start
Run Code Online (Sandbox Code Playgroud)
编辑incrontab
文件
$incrontab -e
/home/spatel IN_CLOSE_WRITE touch /tmp/incrontest-$#
Run Code Online (Sandbox Code Playgroud)
测试一下
$touch /home/spatel/alpha
Run Code Online (Sandbox Code Playgroud)
结果:
$ls -l /tmp/*alpha*
-rw-r--r-- 1 spatel spatel 0 Feb 4 12:32 /tmp/incrontest-alpha
Run Code Online (Sandbox Code Playgroud)
注:在Ubuntu
你需要在启动时激活的inotify.请在Grub menu.lst文件中添加以下行:
kernel /boot/vmlinuz-2.6.26-1-686 root=/dev/sda1 ro inotify=yes
Run Code Online (Sandbox Code Playgroud)
您可以使用神奇的inotify
工具来做到这一点:
inotifywait -r -m ./YOUR_MONITORED_DIR |
while read a b file; do
[[ $b == *CREATE* ]] && ./another_script "$file"
done
Run Code Online (Sandbox Code Playgroud)
这种方法的一大优点是可以避免每 N 秒轮询一次。
Inotify(索引节点通知)是一个 Linux 内核子系统,用于扩展文件系统以通知文件系统的更改,并将这些更改报告给应用程序。它取代了具有类似目标的早期工具 dnotify。
http://en.wikipedia.org/wiki/Inotify
请参阅inotify 文档