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=XXXGNU 还有一个选项tar,但并不是所有的tar识别它的变体。显然,您可以根据需要添加更多模式和(de)压缩器。识别CPIO和shar文件并不是那么难。名单还在继续。
大多数人都不会厌烦这样的剧本。例如,我通常在实际提取之前检查文件的内容。您可以在脚本中添加参数处理以允许详细输出,或者列出而不是提取(-tfor tar; -lfor unzip)和可能的详细程度。
当无法识别后缀时,更难以识别文件类型。您可以运行file该文件并分析它所说的内容。另一种可能性是分析文件的内容是否放在子目录中; 如果没有,您可以创建一个子目录,然后将内容提取到子目录中。机会很多。