Source: apc-abstract/task/worker/clean_dead_symlinks.js

/**
 * Remove symbolic links if it's destination file does not exist.
 * @function task.worker.cleanDeadSymlinks.
 * @param {object} config - Configuration object.
 * @param {string} [config.basedir='.'] - Directory to clean.
 * @param {function} callback - Callback when done.
 * @function
 * @author Taka Okunishi
 *
 */
var fs = require('fs'),
    path = require('path'),
    debug = require('./_debug'),
    readdirRecursive = require('../../lib/file/readdir_recursive');

exports = module.exports = function (config, callback) {
    var async = require('async');
    var basedir = config.basedir || '.';
    readdirRecursive(basedir, function (err, filenames) {
        if (err) {
            callback(err);
            return;
        }
        async.parallel(
            filenames
                .map(function (filename) {
                    return path.resolve(basedir, filename);
                })
                .map(function (filename) {
                    return function (callback) {
                        fs.lstat(filename, function (err, stats) {
                            if (err) {
                                callback(err);
                                return;
                            }
                            var isSymlink = stats.isSymbolicLink();
                            if (!isSymlink) {
                                callback(err);
                                return;
                            }
                            fs.exists(filename, function (eixsts) {
                                if (eixsts) {
                                    callback(null);
                                } else {
                                    fs.unlink(filename, function (err) {
                                        if (!err) {
                                            debug.cleanDeadLink(filename);
                                        }
                                        callback(err);
                                    });
                                }
                            });

                        });
                    }
                }),
            function (err) {
                callback(err);
            }
        )
    });
};