linux - watch a directory for new files, then run a script

后端 未结 2 1498
再見小時候
再見小時候 2020-12-17 03:54

I want to watch a directory in Ubuntu 14.04, and when a new file is created in this directory, run a script.

specifically I have security cameras that upload via FTP

相关标签:
2条回答
  • 2020-12-17 04:22

    Although inotifywait was mentioned in comments, a complete solution might be useful to others. This seems to be working:

     inotifywait -m -e close_write /tmp/upload/ | gawk '{print $1$3; fflush()}' | xargs -L 1 yourCommandHere
    

    will run

      yourCommandHere /tmp/upload/filename
    

    when a newly uploaded file is closed

    Notes:

    • inotifywait is part of apt package inotify-tools in Ubuntu. It uses the kernel inotify service to monitor file or directory events
    • -m option is monitor mode, outputs one line per event to stdout
    • -e close_write for file close events for files that were open for writing. File close events hopefully avoid receiving incomplete files.
    • /tmp/upload can be replaced with some other directory to monitor
    • the pipe to gawk reformats the inotifywait output lines to drop the 2nd column, which is a repeat of the event type. It combines the dirname in column 1 with the filename in column 3 to make a new line, which is flushed every line to defeat buffering and encourage immediate action by xargs
    • xargs takes a list of files and runs the given command for each file, appending the filename on the end of the command. -L 1 causes xargs to run after each line received on standard input.
    0 讨论(0)
  • 2020-12-17 04:27

    You were close to solution there. You can watch many different events with iwatch - the one that interests you is close_write. Syntax:

    iwatch -e close_write <directory_name>
    

    This of course works only if file's closed when the writing's complete, which, while it's a sane assumption, it's not necessarily a true one (yet often is).

    0 讨论(0)
提交回复
热议问题