Answers:
编写这样的脚本并不是那么难,但你需要小心一点。问题是zip
文件就像压缩的tar文件,并解压缩它们提取文件。并非所有文件都被压缩gzip
,bzip2
或者xz
必然是tar
文件下面的文件(当然,.tar.bz2
文件是;因此是.tgz
文件)。因此,您必须使用普通.gz
文件定义要执行的操作,以及是否始终要将tar文件解压缩。
鉴于该序言,您可以编写如下脚本:
#!/bin/sh
# Optionally override the default commands
: ${GZIP:=gzip}
: ${TAR:=tar}
: ${BZIP2:=bzip2}
: ${XZ:=xz}
: ${UNZIP:=unzip}
for file in "$@"
do
case "$file" in
(*.tar.gz|*.tgz|*.tar)
$TAR -xf "$file";;
(*.tar.xz)
$XZ -cd "$file" | $TAR -xf -;;
(*.xz)
$XZ -d "$file";;
(*.gz)
$GZIP -d "$file";;
(*.tar.bz2)
$TAR -xf "$file";;
(*.bz2)
$BZIP2 -d "$file";;
(*.zip)
$UNZIP "$file";;
(*) echo "$0: unrecognized file type $file" >&2;;
esac
done
那里没有太多的火箭科学。我假设你的版本是自动tar
识别gzip
和bzip2
文件; 如果没有,那么你需要做的更多或更少,就像我做的那样xz
。--use-compress-program=XXX
GNU 还有一个选项tar
,但并不是所有的tar
识别它的变体。显然,您可以根据需要添加更多模式和(de)压缩器。识别CPIO和shar文件并不是那么难。名单还在继续。
大多数人都不会厌烦这样的剧本。例如,我通常在实际提取之前检查文件的内容。您可以在脚本中添加参数处理以允许详细输出,或者列出而不是提取(-t
for tar
; -l
for unzip
)和可能的详细程度。
当无法识别后缀时,更难以识别文件类型。您可以运行file
该文件并分析它所说的内容。另一种可能性是分析文件的内容是否放在子目录中; 如果没有,您可以创建一个子目录,然后将内容提取到子目录中。机会很多。