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


3

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

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

  • 柏油
  • tar.gz的
  • TGZ
  • GZ
  • gzip的
  • BZ2
  • 压缩

涉及单线命令的简单想法将是最佳解决方案,但任何评论都表示赞赏。


1
你想怎么解压缩?进入同一个文件夹?进入一个具有压缩文件名称的新文件夹?
Trevor Rudolph

只是将文件放到同一个文件夹中是正确的,但它并不重要
NPalopoli

Answers:


6

编写这样的脚本并不是那么难,但你需要小心一点。问题是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识别它的变体。显然,您可以根据需要添加更多模式和(de)压缩器。识别CPIO和shar文件并不是那么难。名单还在继续。

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

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


我知道这样的方法,并期望一个更简单,更短的解决方案是可能的,所以我现在不会回答这个问题。但是,鉴于我提供的信息有限,您的解决方案是公平的,并提供了许多扩展到其他文件类型的选项。我感谢您花时间将注意力转移到其他相关方面。
NPalopoli
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.