User Tools

Site Tools


directory:run_a_command_upon_files_or_directories_changes

This is an old revision of the document!


Directory - Run a Command Upon Files or Directories Changes

Use either inotifywait or iwatch.


Using inotifywait

Install inotify-tools

sudo apt install inotify-tools

Test inotifywait

In a shell enter:

while true; do
  res=`inotifywait -r thedirtowatch/ --format %f`;
  echo "RESULT=$res";
done

returns:

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

NOTE: The %f** refers to the filename in the event. See http://manpages.ubuntu.com/manpages/focal/man1/inotifywait.1.html for options. </WRAP> —- In a 2nd shell, go to that directory being watched. <code bash> touch test1 </code> NOTE: Back on the 1st shell this should show you output: <code bash> RESULT=test1 </code> —-

NOTE: An additional -e option can be added to the inotifywait to only listen for certain events.

For example:

while true; do res=`inotifywait -e create, open, close, modify, moved_to, moved_from -r thedirtowatch/ --format '%e %f'` ; echo "RESULT=$res\n"; done

The --format option is changed to include showing %e which is the actual event. Obviously change as needed.

See http://manpages.ubuntu.com/manpages/focal/man1/inotifywait.1.html for options.

—- ===== More ===== <code bash> inotifywait -m -e modify,create -r /yourpath && \ chmod 644 file; && \ chown blah:blah file; </code>

NOTE:

  • -m, –monitor: Instead of exiting after receiving a single event, execute indefinitely. The default behavior is to exit after the first event occurs.
  • -r, –recursive: Watch all sub-directories of any directories passed as arguments. Watches will be set up recursively to an unlimited depth.
    • Symbolic links are not traversed. Newly created sub-directories will also be watched.

—- ===== Using a BASH Script ===== <file bash after-change.sh> #!/bin/bash # # Monitor the input directory and if any change occurs run the provided command: # # Usage: # after-change.sh /tmp ls -al %f if [ $# -lt 3 ]; then echo “Usage: $0 dir cmd ” exit 1 fi which inotifywait 2>&1 >/dev/null if [ “$?” == “1” ]; then echo “ERROR: inotifywait not installed.” exit 1 fi dir=$1 shift cmd=$1 shift options=$* inotifywait -q -r -m $dir $options eval $cmd </file> —- ===== References ===== http://manpages.ubuntu.com/manpages/focal/man1/inotifywait.1.html

directory/run_a_command_upon_files_or_directories_changes.1611654561.txt.gz · Last modified: 2021/01/26 09:49 by peter

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki