如何在不知道扩展名的情况下提取各种 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/zip
或 application/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
我正在编写一个 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/zip
或application/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