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]