Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

node.js

zlib

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.

like image 692
Yanick Rochon Avatar asked Feb 24 '14 13:02

Yanick Rochon


1 Answers

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));
        }
      });
    }
  });
like image 158
robertklep Avatar answered Oct 12 '22 12:10

robertklep