Using a shell script, can I watch a folder and block program execution until a file in a certain folder changes?

all 23 comments

sorted by: hot top controversial new old
[–] 12 points 1 year ago

There is inotifywait which seems to do the job, The Wiki

  • source
  • [–] [S] 10 points 1 year ago

    After some suggestions to check out inotifywait I ended up with a solution that works for me as desired.

    inotifywait --event modify,create ./targetfolder/; echo "new change, that I am interested in, occurred in targetfolder";
    

    It turned out I was interested in both file modification and file creation events.

  • source
  • [–] 8 points 1 year ago

    As another commenter said, you want inotifywait:

    https://linux.die.net/man/1/inotifywait

  • source
  • [–] 5 points 1 year ago

    Maybe inotify or one of those "watcher" (not "watch") tools available, but I don't remember which one to use.

  • source
  • [–] 3 points 1 year ago

    The simplest solution is entr, I use it a lot for development - https://www.linuxbash.sh/post/entr-rerun-commands-when-files-change

  • source
  • [–] 2 points 1 year ago (2 children)
  • [–] [S] 2 points 1 year ago* (last edited 1 year ago) (1 child)

    a hobby project: generate a rss feed based on recent file changes in a directory. But I thought this can also have many applications …

    • auto formatting code files on change
    • automatic backups of a certain folder: run rsync on change in folder.
  • source
  • parent
  • hideshow 1 child comment
  • [–] 1 point 1 month ago* (last edited 1 month ago)

    test also has the -N option.

     -N FILE
       FILE exists and has been modified since it was last read
    

    [ -N $file ] && echo "$file has been modified", no?

  • source
  • [–] -2 points 1 year ago (12 children)

    Can continuously loop over the file, examine the md5 hash for changes.

    Run the script if it has changed.

    https://stackoverflow.com/questions/6475252/bash-script-watch-folder-execute-command

    daemon() {
    chsum1=""
    
    while [[ true ]]
    do
        chsum2=`find src/ -type f -exec md5 {} \;`
        if [[ $chsum1 != $chsum2 ]] ; then           
            if [ -n "$chsum1" ]; then
                compile
            fi
            chsum1=$chsum2
        fi
        sleep 2
    done
    }
    
  • source
  • hideshow 12 child comments
  • [–] 1 point 1 year ago

    Even if you wanted to implement a solution like this, which you shouldn't, why on earth monitor the MD5 sum instead of just the mtime of the file???? Like, doing a checksum is the least efficient method of checking this possible.

    Like, you could do a simple while loop with a find myfile.txt +mmin 1; sleep 30 in it. Adjust numbers to your desired tolerance.

    Again, don't do that. But if you must, definitely don't do an md5sum for godssake.

  • source
  • parent
  • [–] [S] -1 points 1 year ago (8 children)

    I really like this, replace compile with whatever command you desire I guess.

  • source
  • parent
  • hideshow 8 child comments
  • [–] 9 points 1 year ago (7 children)

    This is a terrible solution. You will stress your IO for no reason.

  • source
  • parent
  • hideshow 7 child comments
  • [–] [S] 0 points 1 year ago* (6 children)

    On the upside, you do not need to install the inotifywait package. md5sum already installed on my system haha

  • source
  • parent
  • hideshow 6 child comments
  • [–] 2 points 1 year ago (3 children)
  • [–] 0 points 1 year ago*

    Block execution not entirely. You could chmod it as non-x and use inotifywatch to flip it back.

    Edit: I misunderstood you, use inotifywait like the other person suggested.

  • source