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.
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));
}
});
}
});