我有一个 ZIP 文件,其中有一个顶级目录,其中存储了所有文件:
Release/
Release/file
Release/subdirectory/file
Release/subdirectory/file2
Release/subdirectory/file3
我想提取下面的所有内容Release
并保留目录结构,但是当我运行以下命令时:
unzip archive.zip Release/* -d /tmp
它创建顶级Release
文件夹:
/tmp/Release/
/tmp/Release/file
/tmp/Release/subdirectory/file
/tmp/Release/subdirectory/file2
/tmp/Release/subdirectory/file3
我怎样才能提取里面的所有内容Release
没有创建一个Release
文件夹,如下所示:
/tmp/
/tmp/file
/tmp/subdirectory/file
/tmp/subdirectory/file2
/tmp/subdirectory/file3
答案1
在顶层目录将被提取到的位置创建一个指向您当前位置的符号链接:
ln -s . Release && unzip <YourArchive>.zip
然后删除链接:
rm Release
答案2
该j
标志应阻止创建文件夹unzip -j archive.zip -d .
来自手册页:
-j
junk paths. The archive's directory structure is not recreated;
all files are deposited in the extraction directory (by default, the
current one).
答案3
用于展平提取树的 Python 脚本
下面编写的脚本会提取 zip 文件并将最顶层目录中包含的文件移出到当前工作目录。此快速脚本专门针对此特定问题而定制,其中有一个包含所有文件的单一最顶层目录,但经过一些编辑后,可以适用于更一般的情况。
#!/usr/bin/env python3
import sys
import os
from zipfile import PyZipFile
for zip_file in sys.argv[1:]:
pzf = PyZipFile(zip_file)
namelist=pzf.namelist()
top_dir = namelist[0]
pzf.extractall(members=namelist[1:])
for item in namelist[1:]:
rename_args = [item,os.path.basename(item)]
print(rename_args)
os.rename(*rename_args)
os.rmdir(top_dir)
测试运行
以下是脚本应如何工作的示例。所有内容都提取到当前工作目录,但源文件可以位于完全不同的目录中。测试是在我的个人 github 存储库的 zip 存档上执行的。
$ ls
flatten_zip.py* master.zip
$ ./flatten_zip.py master.zip
['utc-time-indicator-master/.gitignore', '.gitignore']
['utc-time-indicator-master/LICENSE', 'LICENSE']
['utc-time-indicator-master/utc-time-indicator', 'utc-time-indicator']
['utc-time-indicator-master/utc_indicator.png', 'utc_indicator.png']
$ ls
flatten_zip.py* LICENSE master.zip utc_indicator.png utc-time-indicator
使用位于不同位置的源文件进行测试
$ mkdir test_unzip
$ cd test_unzip
$ ../flatten_zip.py ../master.zip
['utc-time-indicator-master/.gitignore', '.gitignore']
['utc-time-indicator-master/LICENSE', 'LICENSE']
['utc-time-indicator-master/utc-time-indicator', 'utc-time-indicator']
['utc-time-indicator-master/utc_indicator.png', 'utc_indicator.png']
$ ls
LICENSE utc_indicator.png utc-time-indicator
答案4
这是一篇旧帖子,但我遇到了同样的问题。对我来说,以下非常简单的解决方案在 bash 中运行良好:
$ cd abc
$ unzip abc.zip -d ../
[-d 扩展目录]
可选目录,用于将文件提取到其中。默认情况下,所有文件和子目录都在当前目录中重新创建;-d 选项允许在任意目录中提取(始终假设用户有权写入目录)。此选项不必出现在命令行的末尾;它也可以在 zipfile 规范之前(使用正常选项)、zipfile 规范之后或文件和 -x 选项之间接受。选项和目录可以连接在一起,中间不加任何空格,但请注意,这可能会导致正常的 shell 行为被抑制。特别是,Unix C shell 将 ''-d ~''(波浪号)扩展为用户主目录的名称,但 ''-d~'' 被视为当前目录的文字子目录 ''~''。