I want a script to sleep unless a certain file is modifed/deleted (or a file created in a certain directory, or ...). Can this be achieved in some elegant way? The simplest thing that comes to my mind is a loop that sleeps for some time before checking the status again, but maybe there is a more elegant way?
On linux, you can use the kernel's
inotify feature. Tools for scripting can be found there: inotify-tools.
Example use from wiki:
#!/bin/sh EVENT=$(inotifywait --format '%e' ~/file1) # blocking without looping [ $? != 0 ] && exit [ "$EVENT" = "MODIFY" ] && echo 'file modified!' [ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!' # etc...
Indeed there is: entr(1) will run arbitrary commands when files change, and also provides an auto-reload option for restarting application servers.
edit: some examples
Rebuild if sources files change
$ find *.c | entr make
Launch and auto-reload test server if files change
$ ls *.py | entr -r python main.py
Providing a the agument
+/path/to/fifo allows more complex scripting by instructing
entr to write the name of each file that changes to a named pipe. The following will convert Markdown files in the current directory to HTML as they're edited
$ ls *.md | entr +/tmp/notify & $ while read F > do > markdown2html $F > done < /tmp/notify