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

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

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

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

  • 柏油
  • 压缩文件
  • 特格孜
  • 广州
  • 压缩
  • bz2
  • 压缩

涉及单行命令的更简单的想法将是最好的解决方案,但任何评论都值得赞赏。

答案1

编写这样的脚本并不难,但你需要小心一点。问题是zip文件就像压缩的 tar 文件,解压它们会提取文件。并非所有使用gzipbzip2或压缩的文件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识别gzipbzip2文件;如果没有,那么你需要做或多或少的事情,就像我对所做的那样xz。还有一个--use-compress-program=XXXGNU 选项tar,但并非所有的变体都能tar识别它。显然,你可以根据自己的需要添加更多模式和(解)压缩器。识别 CPIO 和 shar 文件并不难。这样的例子不胜枚举。

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

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

相关内容