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