解压特定目录而不创建顶层目录

解压特定目录而不创建顶层目录

我有一个 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~'' 被视为当前目录的文字子目录 ''~''。

来源:https://linux.die.net/man/1/unzip

相关内容