Có rất nhiều định dạng file nén, và trên Linux thật đáng ngạc nhiên là cũng có ngần đó lệnh để xử lý những format đó. Tôi viết script này chủ yếu là vì không muốn nhớ hết chúng.

Cài đặt thêm các CLI hỗ trợ các định dạng nén nếu chưa có.

$ sudo apt-get install tar zip rar \
      arj lhasa p7zip rpm2cpio cabextract

Trong tất cả thì p7zip hỗ trợ hầu hết các loại format. Tuy nhiên với các định dạng .tar.gz hay .tar.bz2 thì lại phải thực hiện 2 bước: Giải nén từ .tar.gz / .tar.bz2 thành dạng .tar (Tape Archive), sau đó lại giải nén từ .tar nên khá chậm chạp. Vì vậy tốt nhất là dùng hàng auth của nó là lệnh tar cho nhanh gọn.

Tương tự với các format khác, mình cũng dùng hàng auth cho chất.

Các định dạng được phân biệt bằng phần mở rộng (extension) của file.

/usr/local/bin/unpack.sh

#!/bin/bash
 
[ $# -eq 0 -o "${full_path}" = "-h" ] && {
  echo "Usage: $(basename $0) <archive> [directory]" >&2
  exit 1
}
 
[ ! -f "$1" ] && {
  echo "'$1' is not found." >&2
  exit 1
}
 
full_path="$(readlink -f "$1")"
file_name="$(basename "$1")"
 
# if the target directory is available
if [ $# -gt 1 ]; then
  mkdir -p "$2" && cd "$2" || {
    echo "Could not see the output directory." >&2
    exit 1
  }
fi
 
case ${file_name,,} in
*.z)       uncompress "${full_path}" ;;
*.tar)     tar xvf "${full_path}" ;;
*.tgz)     tar zvxf "${full_path}" ;;
*.tar.z)   zcat "${full_path}" | tar xvf - ;;
*.tar.xz)  tar vxf "${full_path}" ;;
*.tar.gz)  tar vxf "${full_path}" ;;
*.tar.bz2) tar jvxf "${full_path}";;
*.gz)      gzip -vd "${full_path}";;
*.zip)     unzip "${full_path}" ;;
*.jar)     unzip "${full_path}" ;;
*.rar)     rar e "${full_path}" ;;
*.arj)     arj e "${full_path}" ;;
*.lzh)     lha e "${full_path}" ;;
*.deb)     ar p "${full_path}" data.tar.gz | \
           tar -xvzf - ;;
*.cpio)    cpio -i -F "${full_path}" ;;
*.rpm)     rpm2cpio "${full_path}" | \
           cpio -i --make-directories ;;
*.7z)      7z x "${full_path}" ;;
*.cab)     cabextract "${full_path}" ;;
*.exe)     cabextract "${full_path}" ;;
*)         echo "Unknown file type. Try 7z." >&2
           7z x "${full_path}" ;;
esac

Phân quyền executable cho script.

$ sudo chmod +x /usr/local/bin/unpack.sh

Cách sử dụng

$ unpack.sh <COMPRESSED FILE> [OUTPUT DIR]