Created: 2011-07-12 19:56
Updated: 2018-03-07 21:00

watch-tree - Recursive directory watch (for Linux)

watch-tree is a small tool to watch directories for changes recursively. It uses node-inotify to watch for changes, thus only works on Linux at the moment. Help adding support for NodeJS-FSEvents for OSX would be appreciated.

Note that this library is likely a temporary one, as Node will likely support recursive directory watches cross-platform through libuv sometime soon-ish.

The API conciously does not expose any inotify internals directly in order to ease the addition of FSEvents support down the road.


var watchTree = require("watch-tree").watchTree;

var watch = watchTree("/home/christian", function (event) {
    // See description of event below

watch.end(); // Release watch

watch = watchTree("/home/christian", {
    exclude: ["node_modules", "~", "#", /^\./]
}, function (event) {
    // Respond to change

watchTree(dir, callback)

Watches directory dir recursively for changes. Only a subset of the inotify events are supported; create file/diretory, modify file/directory and delete file/directory. Other events, such as access, is not currently supported. This limitation is simply the result of my YAGNI approach. Other events may be added later if necessary.

The callback is called with an event object. The event is described below.

watchTree(dir, options, callback)

Watch a directory recursively, with some specific options. Currently, you can only specify a single option:

{ exclude: [] }

The exclude array specifies file patterns to exclude from watches. If a pattern matches a directory, watch-tree will not recurse into it. If it matches a file, changes to that file will not trigger an event.

The excludes can be either strings or regular expressions, but are always treated as regular expressions. That means that

{ exclude: [".git", "node_modules"] }

Will be treated the same way as:

{ exclude: [new RegExp(".git"), new RegExp("node_modules")] }

If you only want to exclude specific files, be sure to provide full paths. watch-tree does not expand paths, it will resolve all paths relative to the original directory. So this:

watchFile(".git", function (event) { /* ... *) });

Will watch (and consider excludes for) directories like .git/branches. And this:

watchFile("/home/christian/projects/watch-tree/.git", function (event) {});

Will watch (and consider excludes for) directories like /home/christian/projects/watch-tree/.git.


The event object has the following properties:


The full (relative) path to the file/directory that changed. As far as I know, this will not be available with FSEvents, so it may go away.


Returns true if the cause of the change was a directory. Same challenge as name.


Returns true if the cause of the change was a file. Same challenge as name.


Returns true if the cause of the event was a newly created file/directory.


Returns true if the cause of the event was a deleted file/directory.


Returns true if the cause of the event was a modified file/directory.

Cookies help us deliver our services. By using our services, you agree to our use of cookies Learn more