Big update!Introducing GitHub Bot Commands. Learn more
Log inBook a demo


Package Overview
File Explorer

Advanced tools


filesystem bindings for tar-stream


Version published
Weekly downloads
decreased by-12.21%

Weekly downloads




filesystem bindings for tar-stream.

npm install tar-fs

build status


tar-fs allows you to pack directories into tarballs and extract tarballs into directories.

It doesn't gunzip for you, so if you want to extract a .tar.gz with this you'll need to use something like gunzip-maybe in addition to this.

var tar = require('tar-fs') var fs = require('fs') // packing a directory tar.pack('./my-directory').pipe(fs.createWriteStream('my-tarball.tar')) // extracting a directory fs.createReadStream('my-other-tarball.tar').pipe(tar.extract('./my-other-directory'))

To ignore various files when packing or extracting add a ignore function to the options. ignore is also an alias for filter. Additionally you get header if you use ignore while extracting. That way you could also filter by metadata.

var pack = tar.pack('./my-directory', { ignore: function(name) { return path.extname(name) === '.bin' // ignore .bin files when packing } }) var extract = tar.extract('./my-other-directory', { ignore: function(name) { return path.extname(name) === '.bin' // ignore .bin files inside the tarball when extracing } }) var extractFilesDirs = tar.extract('./my-other-other-directory', { ignore: function(_, header) { // pass files & directories, ignore e.g. symlinks return header.type !== 'file' && header.type !== 'directory' } })

You can also specify which entries to pack using the entries option

var pack = tar.pack('./my-directory', { entries: ['file1', 'subdir/file2'] // only the specific entries will be packed })

If you want to modify the headers when packing/extracting add a map function to the options

var pack = tar.pack('./my-directory', { map: function(header) { = 'prefixed/' return header } }) var extract = tar.extract('./my-directory', { map: function(header) { = 'another-prefix/' return header } })

Similarly you can use mapStream incase you wanna modify the input/output file streams

var pack = tar.pack('./my-directory', { mapStream: function(fileStream, header) { // NOTE: the returned stream HAS to have the same length as the input stream. // If not make sure to update the size in the header passed in here. if (path.extname( === '.js') { return fileStream.pipe(someTransform) } return fileStream; } }) var extract = tar.extract('./my-directory', { mapStream: function(fileStream, header) { if (path.extname( === '.js') { return fileStream.pipe(someTransform) } return fileStream; } })

Set options.fmode and options.dmode to ensure that files/directories extracted have the corresponding modes

var extract = tar.extract('./my-directory', { dmode: parseInt(555, 8), // all dirs should be readable fmode: parseInt(444, 8) // all files should be readable })

It can be useful to use dmode and fmode if you are packing/unpacking tarballs between *nix/windows to ensure that all files/directories unpacked are readable.

Alternatively you can set options.readable and/or options.writable to set the dmode and fmode to readable/writable.

var extract = tar.extract('./my-directory', { readable: true, // all dirs and files should be readable writable: true, // all dirs and files should be writable })

Set options.strict to false if you want to ignore errors due to unsupported entry types (like device files)

To dereference symlinks (pack the contents of the symlink instead of the link itself) set options.dereference to true.

Copy a directory

Copying a directory with permissions and mtime intact is as simple as


Interaction with tar-stream

Use finalize: false and the finish hook to leave the pack stream open for further entries (see tar-stream#pack), and use pack to pass an existing pack stream.

var mypack = tar.pack('./my-directory', { finalize: false, finish: function(sameAsMypack) { mypack.entry({name: 'generated-file.txt'}, "hello") tar.pack('./other-directory', { pack: sameAsMypack }) } })


Packing and extracting a 6.1 GB with 2496 directories and 2398 files yields the following results on my Macbook Air. See the benchmark here

  • tar-fs: 34.261 seconds
  • node-tar: 366.123 seconds (or 10x slower)





What is tar-fs?

filesystem bindings for tar-stream

Is tar-fs popular?

The npm package tar-fs receives a total of 6,316,868 weekly downloads. As such, tar-fs popularity was classified as popular.

Is tar-fs well maintained?

We found that tar-fs demonstrated a not healthy version release cadence and project activity because the last version was released a year ago.It has 2 open source maintainers collaborating on the project.

Last updated on 06 Nov 2020

Did you know?

Socket installs a Github app to automatically flag issues on every pull request and report the health of your dependencies. Find out what is inside your node modules and prevent malicious activity before you update the dependencies.

Install Socket


Subscribe to our newsletter

Get open source security insights delivered straight into your inbox. Be the first to learn about new features and product updates.

  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc