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


12

我有一个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

试试这个unzip archive.zip && mv Release/* .
George Udosen

@George这仍然会创建一个Release文件夹
jsta

Answers:


5

您的情况下,请尝试在目标文件夹中:

ln -s Release . && unzip <YourArchive>.zip

无需删除已创建的链接:

rm Release

3

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).

9
我认为这已经很接近了,但是OP希望仅跳过顶级目录的创建并保留其余目录结构。该-j选项将所有文件转储到当前目录中,而与归档文件中的目录结构无关。
查尔斯·格林

1

扁平化提取树的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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.