Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

There is a directory A whose contents are changed frequently by other people.

I have made a personal directory B where I keep all the files that have ever been in A.

Currently I just occasionally run rsync to get the files to be backed up from A to B. However I fear the possibility that some files will get added in A, and then removed from A before I get the chance to copy them over to B.

What is the best way to prevent this from occurring? Ideally i'd like to have my current backup script run every time the contents of A get changed.

share|improve this question
up vote 18 down vote accepted

If you have inotify-tools installed you can use inotifywait to trigger an action if a file or directory is written to:

while inotifywait -qqre modify "$dir1"; do

Where the -qq switch is completely silent, -r is recursive (if needed) and -e is the event to monitor, in this case modify. From man inotifywait:

A watched file or a file within a watched directory was written to.
share|improve this answer
incrond may also be of interest. – Shawn J. Goff Nov 6 '11 at 13:50
Cool. Would I just put the above script in my bashrc so that it run's when i log in? Is there another way I can have it running all the time? – oadams Nov 7 '11 at 11:53
For login, yes /etc/profile for system-wide or .bash_profile for just your user. To run it after boot, it depends on your flavour of Unix/Linux; /etc/rc.local,/etc/rc.d/ or /etc/init.d/ – jasonwryan Nov 7 '11 at 17:05
For larger directories you might want to consider using the --monitor switch (and pipe the output to your loop instead), otherwise there is a lot of overhead when inotifywait is started over and over again – Tobias Kienzler Jan 10 '13 at 17:10
How reliably would this solution work to run a script for each file that was added in a directory tree through an FTP server (let's say that a new file is added every 3 minutes on average and this might go on for years)? If not very, is there an alternative solution? – Nikola Novak Sep 10 '15 at 8:50

Strictly speaking, if someone drops a file and very quickly removes it, you might miss it. The use of inotify (under Linux, or a similar feature under other unices) makes the window of risk small.

If you can mount the filesystem of your choice on that directory (I realize this may not be an option), you can put one that records all file versions, for example copyfs.

share|improve this answer

The program you're looking for is inotify.

share|improve this answer

You can use fswatch, a portable tool which selects the appropriate event mechanism if available (Linux, Mac, *BSD) or just stat(2) elsewhere. I did not write it, but I use it. It's open source (GNU GPL).

Example usage:

fswatch -e '.' -i '\.end$' . | while read file
    # Get rid of removed file events
    ls $file 2>/dev/null || continue

    echo "Importing ${file%.end}.sqlite... it takes a while"
    sleep 5 && rm $file
share|improve this answer

Try entr command-line tool which can run arbitrary commands when files change. Since 2.9 release, a directory watch option (-d) was added to react to events when a new file is added to a directory.

Example to run the utility if a new file is added to the project:

$ while true; do
> echo src/* | entr -d your_command
> done

In directory watch mode the parent directory of each file is implicitly added to the watch list.

The only implication of this is that if a new file appears it must exit to allow an external shell loop to rescan the file system.

Here is the version without a directory watch option:

$ while true; do
> echo src/* src | entr your_command
> done

Here is a simpler example depending on your needs:

$ ls -d * | entr sh -c 'rsync -vuar A B'

Check: entrproject.org website for more details.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.