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

时间:2015-03-11 03:25:26

标签: bash zip tar

我正在编写一个bash脚本,需要处理一堆具有不同可能性的zip文件(主要是tar.gz,zip和rar)。有没有一个工具可以做到这一点,所以我可以调用“toolname filename”,如果没有,我如何确定文件的扩展名(这样我可以使用不同的必需工具制作一个case语句)? / p>

3 个答案:

答案 0 :(得分:3)

是的,你可以制作一个复杂的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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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