我需要从我知道路径的ZIP文件中提取单个文件。是否有类似以下的命令:不幸的是,以上命令提取并重新创建了文件./path/to/zipped/file.txt的完整路径。有没有办法将文件简单地拉到指定目录中?

#1 楼

您可以使用-p选项仅将文本提取到标准输出:

unzip -p myarchive.zip path/to/zipped/file.txt >file.txt


这不会提取元数据(日期,权限等),仅提取文件内容(显然,它仅适用于常规文件,不适用于符号链接,设备,目录...)。这是为了不必再移动文件而带来的便利而要付出的代价。带有AVFS:

mountavfs
cp -p ~/.avfs"$PWD/myarchive.zip#"/path/to/zipped/file.txt .


或带保险丝拉链:

mkdir myarchive.d
fuse-zip myarchive.zip myarchive.d
cp -p myarchive.d/path/to/zipped/file.txt .
fusermount -u myarchive.d; rmdir myarchive.d


评论


它可以用于二进制文件,例如jar文件吗?

– Naftuli Kay
2011年6月1日的1:01

@TKKocheran:Jar文件是zip文件,因此解压缩和融合zip方法显然可以工作。 AVFS方法也可以使用,因为AVFS根据文件名猜测格式并了解.jar。如果文件的名称不同,则可能需要告诉AVFS使用其zip处理程序,例如〜/ .avfs $ PWD / foo.apk#uzip / META-INF。

–吉尔斯'所以-不再是邪恶的'
2011年6月1日7:19

实际上,我的意思是从ZIP压缩文件中提取JAR /二进制文件。我还没有机会进行测试,使用上面的第一个命令提取二进制文件是否可以看到任何问题?

– Naftuli Kay
2011年6月1日18:41

@TKKocheran:没问题,-p按原样提取文件(-c进行文本转换)。

–吉尔斯'所以-不再是邪恶的'
2011年6月1日20:50

我认为@Myles的答案更为优雅,因为它不需要输出重定向,并且保留了文件属性。

– Gertvdijk
2012年12月4日15:42

#2 楼

unzip -j "myarchive.zip" "in/archive/file.txt" -d "/path/to/unzip/to"


输入压缩文件的完整路径,而不仅仅是文件名。确保从zip文件中看到的结构保持不变。

这会将file.txt中的单个文件myarchive.zip提取到/path/to/unzip/to/file.txt中。

评论


它不能处理您希望生成的文件名不同的情况。

–奥列格(Oleg Vaskevich)
14-10-27在21:21

“ -j”参数:垃圾路径。不会重新创建档案的目录结构;所有文件都存放在提取目录中(默认情况下是当前目录)。 “ -d”参数:将文件解压缩到exdir

– e1i45
15年1月29日在16:14

@OlegVaskevich,问题不要求目标文件名不同

– Tapemaster
15年5月11日在10:49

仅供参考,以查找zip文件的路径,减少使用:superuser.com/questions/216617/…

–杨艺博
17-10-24在6:17

unzip接受通配符,因此要解压缩子目录:unzip -j archive.zip“ sub / dir / *” -d“ dest / dir”

– Noam Manos
20-05-21在10:27

#3 楼

更简单的版本:

unzip ARCHIVE_NAME PATH_OF_FILE_INSIDE_ARCHIVE


这将在当前目录中重新创建PATH_OF_FILE_INSIDE_ARCHIVE,但仅提取指定的文件。要列出Zip存档中的所有文件:

unzip -l ARCHIVE_NAME


评论


这也适用于通配符,至少在CentOS中如此-例如解压缩foo.zip * .bar

–奥兰
20-05-21在14:32

#4 楼

在macOS上,默认情况下使用Info-Zip

首先列出文件以查找所需的内容。

unzip -l my.zip


,然后从存档

unzip my.zip annoying/path/to/file/in/zip


用-p组合标准输出

unzip -p my.zip annoying/path/to/file/in/zip >./file


或-j提取到当前目录(丢弃垃圾路径)

unzip -j my.zip annoying/path/to/file/in/zip


-d可以指定创建任意目录

unzip -d /path/to/dir my.zip annoying/path/to/file/in/zip


如果要将文件放在-d目录中,则可能需要将其与-j选项合并。

#5 楼

简单易用:
unzip zipfile.zip path/inside/zip/file.txt

,它将使文件膨胀。
$ unzip -l ./../html.zip | grep wp-config

     3328  07-22-2019 15:10   html/wp-config.php

     2898  01-07-2019 23:30   html/wp-config-sample.php

$ unzip ./../html.zip html/wp-config.php

     Archive:  ./../html.zip
     inflating: html/wp-config.php

$ ls -lrth

     total 4.0K
     drwxr-sr-x 2 apache apache 4.0K Jul 26 14:41 html

$ ls -lrth html/*

     total 4.0K
     -rw-rw-rw- 1 apache apache 3.3K Jul 22 15:10 wp-config.php


评论


也可以添加-d outpath参数以指定文件放置位置。

– Efren
19/09/18'2:45

和-j参数可以避免压缩路径

– Efren
19-09-18在2:56

#6 楼

如果要从档案库中还原文件的元数据,能够以任意名称还原任何类型(包括符号链接)的文件,并选择文件的新名称,则可以使用libarchive的bsdtar(它也支持ZIP格式)档案),而不是unzip,例如:因此,如果要提取的存档成员的路径确实包含unzipsome/dir/originalname*?字符,则需要按以下所示对它们进行转义:



bsdtar -nqvvxpf file.zip -'s/.*/newname/S' some/dir/originalname


如果存档成员名为\

请注意,该方法适用于libarchive支持的任何存档格式,不只是拉链。

#7 楼

提取到相对目录

unzip -j -d relativedir archive.zip path/in/archive/file.ext


提取到当前目录

unzip -j -d . archive.zip path/in/archive/file.ext


提取到绝对目录

unzip -j -d /absolutedir archive.zip path/in/archive/file.ext