55 lines
1.3 KiB
Bash
Executable File
55 lines
1.3 KiB
Bash
Executable File
#!/bin/zsh
|
|
|
|
|
|
# 这个脚本可以根据文件 16 进制判断压缩格式,然后通过对应命令解压
|
|
# 解压函数:file 接收文件名,cmd 接收命令,opt 参数选项
|
|
decompress() {
|
|
file=$1
|
|
cmd=$2
|
|
opt=$3
|
|
$cmd $opt $file
|
|
}
|
|
|
|
|
|
# 数组:存储支持的压缩格式和对应的文件头和解压命令
|
|
# 每个元素的格式为:文件 16 进制头:解压命令:选项
|
|
formats=(
|
|
377abcaf:7z:x
|
|
213c6172:ar:x
|
|
425a6839:bunzip2:
|
|
504b0304:unzip:
|
|
7f454c46:7z:x
|
|
1f8b0808:gunzip:
|
|
5d000080:unlzma:
|
|
1f8b0800:tar:-zxvf
|
|
fd377a58:unxz:
|
|
)
|
|
#判断是否为 tar
|
|
filesion=$(file $1 | cut -d':' -f2-)
|
|
if [[ "$filesion" == *tar* ]]; then
|
|
tar -xvf "$1"
|
|
#判断是否为文件
|
|
elif [[ -f $1 ]]; then
|
|
header=$(xxd -p -l 4 $1)
|
|
# 定义一个变量,表示是否找到匹配的格式
|
|
found=0
|
|
# 遍历数组,匹配文件头和解压命令
|
|
for format in $formats; do
|
|
# 使用 IFS 分隔数组元素的各个字段
|
|
IFS=: read head cmd opt <<< $format
|
|
# 如果文件头匹配,调用解压函数,并设置 found 为 1
|
|
if [[ $header == $head* ]]; then
|
|
decompress $1 $cmd $opt
|
|
found=1
|
|
break
|
|
fi
|
|
done
|
|
# 如果没有找到匹配的格式,打印提示信息
|
|
if [[ $found == 0 ]]; then
|
|
echo "无法识别的压缩格式"
|
|
fi
|
|
else
|
|
echo "不是一个文件"
|
|
fi
|
|
|