Node.js : Specify files to unzip with zlib + tar

node.js, zlib

Solution

It works similar to the `unzip` module:

var fs = require('fs');
var tar = require('tar');
var zlib = require('zlib');
var path = require('path');
var mkdirp = require('mkdirp'); // used to create directory tree

var log = console.log;

var tarball = 'path/to/downloaded/archive.tar.gz';
var dest    = 'path/to/destination';

fs.createReadStream(tarball)
  .on('error', log)
  .pipe(zlib.Unzip())
  .pipe(tar.Parse())
  .on('entry', function(entry) {
    if (/\.js$/.test(entry.path)) { // only extract JS files, for instance
      var isDir     = 'Directory' === entry.type;
      var fullpath  = path.join(dest, entry.path);
      var directory = isDir ? fullpath : path.dirname(fullpath);

      mkdirp(directory, function(err) {
        if (err) throw err;
        if (! isDir) { // should really make this an `if (isFile)` check...
          entry.pipe(fs.createWriteStream(fullpath));
        }
      });
    }
  });

Problem

An installation process is downloading a `.tar.gz` archive, then extract the files to a destination directory. However, not all the files in the archive are required, and I'd like to specify which files should be extracted. The naïve way would be to delete the unnecessary files after extraction, but I'd like a "cleaner" way and filter out instead. Is this possible? The (relevant) code I have so far is (stripped for readability) ``` var fs = require('fs'); var tar = require('tar'); var zlib = require('zlib'); var log = console.log; var tarball = 'path/to/downloaded/archive.tar.gz'; var dest = 'path/to/destination'; fs.createReadStream(tarball) .on("error", log) .pipe(zlib.Unzip()) .pipe(tar.Extract({ path: dest })) .on("end", log); ``` Thank you.

Original source

Related problems