Script giải nén nhiều định dạng trên Linux

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.

Script giải nén nhiều định dạng trên Linux
Công cụ giải nén mọi định dạng nén

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

Phản hồi về bài viết

Cùng thảo luận chút nhỉ!

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.