是否有任何 UNIX shell 命令可以扩展预先不知道类型的压缩文件?
我应该能够使用此命令来扩展至少以下任何类型的文件,尽管能够处理任何其他已知类型(例如.rar或.7z)的能力将受到欢迎:
- 柏油
- 压缩文件
- 特格孜
- 广州
- 压缩
- bz2
- 压缩
涉及单行命令的更简单的想法将是最好的解决方案,但任何评论都值得赞赏。
答案1
编写这样的脚本并不难,但你需要小心一点。问题是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
识别它。显然,你可以根据自己的需要添加更多模式和(解)压缩器。识别 CPIO 和 shar 文件并不难。这样的例子不胜枚举。
大多数人都不需要这样的脚本。例如,我通常在实际提取文件之前检查文件的内容。您可以向脚本添加参数处理以允许详细输出,或者使用列表而不是提取(-t
for tar
; -l
for unzip
)并可能提供详细性。
更难的一步是当后缀无法识别时识别文件类型。您可以运行file
文件并分析其内容。另一种可能性是分析文件的内容是否会放在子目录中;如果没有,您可以创建一个子目录,然后将内容提取到子目录中。机会很多。