How to use inotifywait to watch a directory for creation of files of a specific extension
how do I modify the inotifywait command to report only when a file of certain type/extension is created
Please note that this is untested code since I don't have access to inotify
right now. But something akin to this ought to work:
inotifywait -m /path -e create -e moved_to |
while read path action file; do
if [[ "$file" =~ .*xml$ ]]; then # Does the file end with .xml?
echo "xml file" # If so, do your thing here!
fi
done
Use a double negative:
inotifywait -m --exclude "[^j][^s]$" /path -e create -e moved_to |
while read path action file; do
echo "The file '$file' appeared in directory '$path' via '$action'"
done
This will only include javascript files
Whilst the double-negative approach of the previous answer is a nice idea since (as TMG noted) it does indeed shift the job of filtering to inotifywait
, it is not correct.
For example, if a file ends in as
then it will not match [^j][^s]$
because the final letter s
does not match [^s]
, therefore it will not be excluded.
In Boolean terms, if S
is the statement:
"the final letter is
s
"
and J
is the statement:
"the penultimate letter is
j
"
then the value of the --exclude
parameter should semantically equate to not(J and S)
, which by De Morgan's laws is not(J) or not(S)
.
Another potential problem is that in zsh
, $path
is a built-in variable representing the array equivalent of $PATH
, so the while read path ...
line will completely mess up $PATH
and cause everything to become unexecutable from the shell.
Therefore the correct approach is:
inotifywait -m --exclude "[^j].$|[^s]$" /path -e create -e moved_to |
while read dir action file; do
echo "The file '$file' appeared in directory '$dir' via '$action'"
done
Note the .
which is needed after [^j]
to ensure that the match is applied in the penultimate position, and also that the |
character (representing the boolean OR mentioned above) should not be escaped here because --exclude
takes POSIX extended regular expressions.
However, please see and upvote @ericcurtin's answer which for newer versions of inotifywait
is a far cleaner approach.