Search code examples
linuxshellinotify

How to run a shell script when a file or directory changes?


I want to run a shell script when a specific file or directory changes.

How can I easily do that?


Solution

  • Use inotify-tools.

    The linked Github page has a number of examples; here is one of them.

    #!/bin/sh
    
    cwd=$(pwd)
    
    inotifywait -mr \
      --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' \
      -e close_write /tmp/test |
    while read -r date time dir file; do
           changed_abs=${dir}${file}
           changed_rel=${changed_abs#"$cwd"/}
    
           rsync --progress --relative -vrae 'ssh -p 22' "$changed_rel" \
               [email protected]:/backup/root/dir && \
           echo "At ${time} on ${date}, file $changed_abs was backed up via rsync" >&2
    done