How to choose directory name during untarring
This should work:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-C
changes to the specified directory before unpacking (or packing). --strip-components
removes the specified number of directories from the filenames stored in the archive.
Note that this is not really portable. GNU tar and at least some of the BSD tars have the --strip-components
option, but doesn't seem to exist on other unix-like platforms.
The dumb way of doing this would work pretty much everywhere though.
tar xf ugly_name.tar && mv ugly_name pretty_name
With GNU tar ≥1.16, use --transform
to apply a sed regexp transformation to each file name (the transformation is applied on the full path in the archive):
tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'
If ugly_name
is the toplevel component of all the file names in the archive, you don't need to bother with precise matching:
tar xf foo.tar --transform 's/ugly_name/pretty_name/'
If you don't know the name of the toplevel directory, you can still use this method, though you might prefer --strip-components
instead.
tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'
With pax
, the POSIX archive utility, use the -s
option, which takes a sed-like replacement expression as an argument.
pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'
Simplest way
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1