Unpack*(er)* - run files, run

What is Unpack?

Unpack makes it possible to unarchive rar and zip files using ruby.

You pass a directory and it will find all your archive files, unpack and remove them (if you want to).

So how do I use it?

Start by installing the gem

sudo gem install unpack

Start irb and include the gem, require 'unpack'

Working with a directory

Unpack everything in the current directory

$ Unpack.runner!
=> [#<Container:0x000001010ab458 @files=["dmd-tsa-cd2.avi"], @directory="/Downloads/Some.Super.Movie/CD2">]

Unpack everything in another directory

$ Unpack.runner!('/some/dir')
=> [#<Container:0x000001010ab458 @files=["some_files.mov"], @directory="/some/dir">]

Unpack and delete archived file

$ Unpack.runner!('.', remove: true)
=> [#<Container:0x000001010ab458 @files=["dmd-tsa-cd2.avi"], @directory="/Downloads/Some.Super.Movie/CD2">]
$ Unpack.runner!('.', remove: true)
=> []

Remove every archive file, even if nothing where unpacked

$ Unpack.runner!('.', remove: true, force_remove: true)
=> []

Unpack all archived file, but not deeper 3 folders down

$ Unpack.runner!('.', depth: 3)
=> [#<Container:0x000001010ab458 @files=["dmd-tsa-cd2.avi"], @directory="/Downloads/Some.Super.Movie/CD2">]

Unpack everything, even one file directories

To prevent you from unarchive files in folders that contains subtitles and other nonrelevant files, the folder must contain 5 archive files or more.

If you want to unpack everything, even subtitles directories, then you will have to specify the min_files option.

$ Unpack.runner!('.', min_files: 0)
=> [#<Container:0x000001010ab458 @files=["english.str"], @directory="/Downloads/Subtitle/">]

Working with one specific file

Unpack a file

$ Unpack.it!(file: 'zip/my_file.zip')
=> [#<Container:0x000001010ab458 @files=["file1", "file2"], @directory="/Downloads/my/files/zip">]

Unpack a specific file, removing it when done

$ Unpack.it!(file: 'zip/my_file.zip', remove: true)
=> [#<Container:0x000001010ab458 @files=["file1", "file2"], @directory="/Downloads/my/files/zip">]

Unpack a specific file and move the new files to a destination directory

$ Unpack.it!(file: 'zip/my_file.zip', to: '/tmp')
=> [#<Container:0x000001010ab458 @files=["file1", "file2"], @directory="/tmp">]

Some configure alternatives

The runner! method

  • ** :min_files ** (Integer) The minimum amount of files in the directory you want to archive the files in. Default is 5.
  • ** :depth ** (Integer) The maximum folder depth. Default is 2.
  • ** :debugger ** (Boolean) Prints some debug output into the console. Default is false.
  • ** :force_remove ** (Boolean) Remove rarfiles, even if no files where unarchived. Default is false. To get this to work you also have to set the remove option to true.
  • ** :remove ** (Boolean) Removes archived files after they have been used. Default is false.
  • ** :absolute_path_to_unrar ** (String) The absolut path to the unrar binary. Default is the unrar binary that comes with the gem.

The it! method

  • :to (String) The absolute or relative path to the destination directory. If nothing is defined, the :file path will be used.
  • :file (String) The absolute or relative path to the archive file.
  • :remove (Boolean) See the runner! method above
  • :absolute_path_to_unrar (String) See the runner! method above
  • :debugger (String) See the runner! method above

What is being returned?

The runner! method returns an Array of Container instances. The it! method returns an instance of Container.

These are the accessors of the Container class.

  • files (String) The absolut path to the files that where unarchived.
  • directory (String) The absolut path to the folder containing the files.

This sounds supr, how do I help?

  • Start by copying the project or make your own branch.
  • Navigate to the root path of the project and run bundle.
  • Start by running all tests using rspec, autotest.
  • Implement your own code, write some tests, commit and do a pull request.


The gem is tested in OS X 10.6.6 using Ruby 1.9.2 and 1.8.7.

Thanks to ...