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 install --yes tar zip rar unrar arj lhasa p7zip rpm2cpio cabextract msitools
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.
~/bin/extract.sh
#!/bin/bash if [ -z "${1}" -o "${1}" = "-h" ]; then echo "Usage: extract.sh < INPUT archive > [ OUTPUT directory ]" >&2 exit 0 fi if [ ! -f "${1}" ]; then echo "'${1}' does not exist." >&2 exit 1 fi path="$(readlink -f "${1}")" # prepare the output directory if [ -n "${2}" ]; then mkdir -p "${2}" && cd "${2}" || { echo "The output directory is not available." >&2 exit 2 } fi case "${path,,}" in *.tar.z) zcat "${path}" | tar xvf - ;; .tar.bz2|*.tar.gz|*.tar.xz|*.tbz2|*.tgz|*.txz|*.tar) tar xvf "${path}" ;; *.z) uncompress "${path}" ;; *.xz) unxz "${path}" ;; *.gz) gzip -vd "${path}" ;; *.bz2) bunzip2 "${path}" ;; *.zip|*.jar) unzip "${path}" ;; *.rar) unrar e "${path}" ;; *.arj) arj e "${path}" ;; *.lzh) lha e "${path}" ;; *.deb) ar p "${path}" data.tar.xz | tar -Jxvf - ;; *.lzma) unlzma "${path}";; *.cpio) cpio -i -F "${path}" ;; *.rpm) rpm2cpio "${path}" | cpio -i --make-directories ;; *.cab|*.exe) cabextract "${path}" ;; *.msi) msiextract "${path}" ;; *.7z) 7z x "${path}" ;; *) echo "Unknown archive type. Try 7z!" >&2 7z x "${path}" ;; esac
Phân quyền executable cho script.
chmod +x ~/bin/extract.sh
Cách sử dụng
extract.sh Downloads/Books.tar.bz2 ~/Documents