如何在不知道扩展名的情况下提取各种 zip 文件 bash

How to extract a variety of zip files without knowing the extension in bash

我正在编写一个 bash 脚本,它需要处理一堆具有不同可能性的 zip 文件(主要是 tar.gz、zip 和 rar)。有没有我可以获得的工具可以执行此操作,因此我可以调用 "toolname filename",如果没有,我如何确定文件的扩展名(以便我可以使用不同的所需工具进行案例陈述)?

bash 模式匹配运算符 ## 通常用于以这种方式提取文件名的一部分。如果$filename包含文件名,那么表达式${filename##*.}就是去掉与模式*.匹配的最长字符串后的文件名,即文件扩展名。

$ filename=foo.tgz
$ echo ${filename##*.}
tgz

如果某些文件确实可能具有像 tar.gz 这样的复合扩展名,那么这可能不是您情况的最佳选择。当您正在寻找的模式更加可变时,您可能希望使用类似嵌套的 globbing 语句的东西:

if [[ $filename = *.tar.gz ]]; then
    tar xzf $filename
elif [[ $filename = *.zip ]]; then
    unzip $filename
elif [[ $filename = *rar ]]; then
    unrar $filename
fi

一种可能更可靠的识别文件类型的方法是 file 工具,它使用识别模式的数据库来识别文件的格式。一些有用的选项:

  • file --mime-type 仅打印易于解析(或匹配)的 mimetype(例如 application/zipapplication/x-gzip
  • file -i 打印 mimetype 和其他参数,例如 charset(与压缩文件无关)
  • file -z 还尝试解压缩文件(不适用于所有存档格式),这是区分简单 gzip 文件和 gzip 压缩文件的最佳方法 tar 档案。

您几乎肯定已经安装了它,但如果没有:the file homepage

是的,您可以制作一个复杂的 shell 脚本来处理这个问题。但是,你不需要。 The right tool is 7z。它将本机处理您提到的所有压缩格式以及更多。

例如,allfiles- 是一个 zip 存档(请注意缺少扩展名)。要列出其内容,请使用 l (ell) 函数:

$ 7z l allfiles-

7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)

Listing archive: allfiles-

--
Path = allfiles-
Type = zip
Physical Size = 367

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2015-03-10 21:05:40 .....           29           29  file1
2015-03-10 21:05:42 .....           29           29  file2
2015-03-10 21:05:44 .....           29           29  file3
------------------- ----- ------------ ------------  ------------------------
                                    87           87  3 files, 0 folders

请注意 7z 不依赖于正确的扩展名。它找出了存档本身的类型。

7z支持的功能有:

   a      Add
   d      Delete
   e      Extract
   l      List
   t      Test
   u      Update/Create
   x      eXtract with full paths

7z支持的文件格式包括:LZMA2、XZ、ZIP、Zip64、 CAB、RAR、ARJ、GZIP、BZIP2、TAR、CPIO、RPM、ISO 以及大多数文件系统映像和 DEB 格式。

要在类似 Debian 的系统上安装 7z,运行:

apt-get install p7zip-full