##############
#
# An arbitrary format archive unpacker, although really we are mainly supporting
-# tar and zip currently, including compressed formats.
+# tar, zip, 7z, and rar at this time.
archive_file="$1"; shift
if [ -z "$archive_file" ]; then
fi
unpack_dir="$1"; shift
if [ -z "$unpack_dir" ]; then
- unpack_dir=$(echo from_$(basename $archive_file) | sed -e 's/^\([^\.]*\)\..*/\1/')
+ all_but_last="$(echo "$(basename "$archive_file")" | sed -e 's/\([\^.]*\)\.[^\.]*$/\1/')"
+ unpack_dir="arch_${all_but_last}"
fi
if [ ! -d "$unpack_dir" ]; then
- mkdir "$unpack_dir"
+ mkdir -p "$unpack_dir"
if [ $? -ne 0 ]; then
echo "Could not create the unpacking directory: $unpack_dir"
exit 1
fi
fi
-if [[ $archive_file =~ .*\.tar$ \
- || $archive_file =~ .*\.tar\.gz$ \
- || $archive_file =~ .*\.tar\.bz2$ \
- || $archive_file =~ .*\.iar$ \
- || $archive_file =~ .*\.oar$ \
- || $archive_file =~ .*\.tgz$ \
- || $archive_file =~ .*\.ova$ \
+#hmmm: we could log to a file and spew the file if there's a failure, then
+# remove the file after spewing or after successful run.
+# this is a really commonly repeated pattern that would be nice to support
+# in general.
+
+# record what happened.
+save_err=1
+if [[ "$archive_file" =~ .*\.tar$ \
+ || "$archive_file" =~ .*\.tar\.gz$ \
+ || "$archive_file" =~ .*\.tar\.bz2$ \
+ || "$archive_file" =~ .*\.tar\.xz$ \
+ || "$archive_file" =~ .*\.iar$ \
+ || "$archive_file" =~ .*\.oar$ \
+ || "$archive_file" =~ .*\.tgz$ \
+ || "$archive_file" =~ .*\.txz$ \
+ || "$archive_file" =~ .*\.ova$ \
+ || "$archive_file" =~ .*\.snarf$ \
]]; then
- tar -xf $archive_file &>/dev/null
-elif [[ $archive_file =~ .*\.zip$ \
- || $archive_file =~ .*\.epub$ \
- || $archive_file =~ .*\.odt$ \
- || $archive_file =~ .*\.jar$ \
- || $archive_file =~ .*\.war$ \
+ tar -xf "$archive_file" &>/dev/null
+ save_err=$?
+elif [[ "$archive_file" =~ .*\.zip$ \
+ || "$archive_file" =~ .*\.epub$ \
+ || "$archive_file" =~ .*\.odt$ \
+ || "$archive_file" =~ .*\.jar$ \
+ || "$archive_file" =~ .*\.war$ \
]]; then
- unzip $archive_file &>/dev/null
+ unzip "$archive_file" &>/dev/null
+ save_err=$?
+elif [[ "$archive_file" =~ .*\.7z$ ]]; then
+ 7z x "$archive_file" &>/dev/null
+ save_err=$?
+elif [[ "$archive_file" =~ .*\.rar$ ]]; then
+ unrar x "$archive_file" &>/dev/null
+ save_err=$?
fi
-save_err=$?
popd &>/dev/null
echo "into the directory: $unpack_dir"
exit 1
else
- echo "Unpacked file $(basename $archive_file) into folder: $unpack_dir"
+ echo "Unpacked file $(basename "$archive_file") into folder: $unpack_dir"
fi