用于扩展任何压缩类型文件的 UNIX shell 命令

NPa*_*oli 3 unix command-line gzip tar

是否有任何 UNIX shell 命令可以扩展事先未知类型的压缩文件?

我应该能够使用此命令至少扩展以下任何类型的文件,但欢迎使用任何其他已知类型(如 .rar 或 .7z)的能力:

  • 柏油
  • tar.gz
  • tgz
  • gz
  • 压缩包
  • bz2
  • 压缩

涉及单行命令的更简单的想法将是最好的解决方案,但任何意见表示赞赏。

Jon*_*ler 6

编写这样的脚本并不难,但您需要小心一点。问题是zip文件就像压缩的 tar 文件,解压缩它们会提取文件。压缩并非所有文件gzipbzip2xz必然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
Run Code Online (Sandbox Code Playgroud)

那里没有太多的火箭科学。我假设您的版本会自动tar识别gzipbzip2归档;如果没有,那么你需要像我所做的那样或多或少地做xz。还有一个--use-compress-program=XXXGNU 选项tar,但并非所有变体tar都能识别它。显然,您可以根据需要添加更多模式和(解)压缩器。识别 CPIO 和 shar 文件不会那么难。名单还在继续。

大多数人不会理会这样的脚本。例如,我通常在实际提取文件之前检查文件的内容。您可以向脚本添加参数处理以允许详细输出,或列表而不是提取(-tfor tar; -lfor unzip)和详细信息。

更难的一步是在无法识别后缀时识别文件类型。您可以运行file该文件并分析它所说的内容。另一种可能是分析文件的内容是否会放在子目录中;如果没有,您可以创建一个子目录,然后将内容提取到子目录中。机会很多。