How to extract a tarball?

Background

I have a release file inside a tarball. However I want the final release to have some additional files and to move things around, for the convenience of the user.

This means I need to do 3 things:

  1. Extract the contents of the tarball into a folder
  2. Add the extra files to said folder and move some items around
  3. compress everything again and call it a day

Problem

While I have it clear on how to execute step 2, using File and friends, I have tried several ways to do steps 1 and 3 and I failed.

I have tried using :zip, but it returns a bad encoding error, probably because the file is not a zip but tar instead.

I am also aware of File.open("path", :read, :compressed), but I don’t want to read anything, I want to extract it into a new folder.

I also checked Unzip but it does not fit my use case.

Question

How can I extract a tar file into a folder and compress a folder into a tar file?

https://www.erlang.org/doc/man/erl_tar

1 Like

Do we have an elixir module/equivalent ?

Using that I have the following error:

> :erl_tar.extract('application-data.tar.gz')
{:error, :invalid_tar_checksum}

So I am guessing I am not passing the correct options, since Windows can extract the file perfectly.

I’m guessing it has to be decompressed first.

Since are trying to extract gziped tar file .tar.gz, you have to decompress as well.

:erl_tar.extract('something.tar.gz', :compressed)
4 Likes

I was able to extract the file using:

:ok = :erl_tar.extract("tar_path", [{:cwd, "tmp"}, :compressed])

This will extract the tar file into the tmp folder. Once there I can do the rest !

1 Like