Cripto Cripto - 1 year ago 48
Bash Question

Run a shell command when a file is added

I have a folder named images on my linux box.
This folder is connected to a website and the admin of the site has the ability to add pictures to this site. However, when a picture is added, I want a command to run resizing all of the pictures a directory.

In short, I want to know how I can make the server run a specific command when a new file is added to a specific location.

Answer Source

I don't know how people are uploading content to this folder, but you might want to use something lower-tech than monitoring the directory with inotify.

If the protocol is FTP and you have access to your FTP server's log, I suggest tailing that log to watch for successful uploads. This sort of event-triggered approach will be faster, more reliable, and less load than a polling approach with traditional cron, and more portable and easier to debug than something using inotify.

The way you handle this will of course depend on your FTP server. I have one running vsftpd whose logs include lines like this:

Fri May 25 07:36:02 2012 [pid 94378] [joe] OK LOGIN: Client ""
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK UPLOAD: Client "", "/path/to/", 8395136 bytes, 845.75Kbyte/sec
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK CHMOD: Client "", "/path/to/ 644"

The UPLOAD line only gets added when vsftpd has successfully saved the file. You could parse this in a shell script like this:


tail -F /var/log/vsftpd.log | while read line; do
  if echo "$line" | grep -q 'OK UPLOAD:'; then
    filename=$(echo "$line" | cut -d, -f2)
    if [ -s "$filename" ]; then
      # do something with $filename

If you're using an HTTP upload tool, see if that tool has a text log file it uses to record incoming files. If it doesn't consider adding some sort of logger function to it, so it'll produce logs that you can tail.