假设我有一个 ZIP 文件,其内容可能如下
# file: with_out_dir.zip
file1.txt
file2.cpp
file3.js
some_sub_dir/
- file_in_subdir.txt
file4.xml
但它也可能看起来像这样
# file: with_dir.zip
archive/
- file1.txt
- file2.cpp
- file3.js
- some_sub_dir/
-- file_in_subdir.txt
- file4.xml
现在我会让我的 bash 脚本提取这些文件,但无论如何都应该将其提取到/var/sample/
这样的位置:
# expected output
/var/
- sample/
-- file1.txt
-- file2.cpp
-- file3.js
-- some_sub_dir/
--- file_in_subdir.txt
-- file4.xml
通过脚本实现这一点的最佳方法是什么bash
?
目前我正在使用它unzip
来提取 zip 文件,但我愿意使用任何其他命令行工具,如果使用它会更容易的话。
答案1
我简单地建议:
- 解压到一个全新的目录中
- 如果提取后,新目录仅包含一个子目录,则将其中的所有文件向上移动一级并删除原始子目录。
顺便说一下,制作一个存档(tar、zip 等)没有将存档的所有成员都放在子目录中是邪恶的。我不知道人们为什么这样做!
答案2
有几种智能提取工具(我在为自己编写了一个之后发现了这些工具)。您可能想查看dtrx
(安装sudo apt-get install dtrx
)。
dtrx
总是如果存档中尚不存在,则创建顶级目录。然后,调整 bash 包装器脚本(调用dtrx
而不是unzip
)变得更加简单,因为它只需要移走子目录并删除顶级目录(因为后者始终存在)。