仅将压缩档案中的特定文件提取到给定目录

Naf*_*Kay 214 zip

我需要从我知道路径的 ZIP 文件中提取一个文件。有没有类似下面的命令:

unzip -d . myarchive.zip path/to/zipped/file.txt
Run Code Online (Sandbox Code Playgroud)

不幸的是,上面的命令提取并重新创建了文件的整个路径./path/to/zipped/file.txt。有没有办法让我简单地将文件拉到指定的目录中?

sMy*_*les 188

unzip -j "myarchive.zip" "in/archive/file.txt" -d "/path/to/unzip/to"
Run Code Online (Sandbox Code Playgroud)

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

这将提取单个文件file.txtmyarchive.zip/path/to/unzip/to/file.txt

  • “-j”参数:垃圾路径。不会重新创建存档的目录结构;所有文件都存放在提取目录中(默认为当前目录)。“-d”参数:将文件解压到exdir (8认同)
  • 它不处理您希望生成的文件名不同的情况。 (2认同)
  • @OlegVaskevich,问题不要求目标文件名不同 (2认同)
  • unzip 接受通配符,所以要**解压缩子目录**:`unzip -j archive.zip "sub/dir/*" -d "dest/dir"` (2认同)

Gil*_*il' 185

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

unzip -p myarchive.zip path/to/zipped/file.txt >file.txt
Run Code Online (Sandbox Code Playgroud)

这不会提取元数据(日期、权限等),仅提取文件内容(显然,它仅适用于常规文件,不适用于符号链接、设备、目录……)。这是为以后不必移动文件的便利而付出的代价。

或者,将存档挂载为目录并仅复制文件。使用AVFS

mountavfs
cp -p ~/.avfs"$PWD/myarchive.zip#"/path/to/zipped/file.txt .
Run Code Online (Sandbox Code Playgroud)

或者使用fuse-zip

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
Run Code Online (Sandbox Code Playgroud)

  • @TKKocheran:没问题,`-p` 按原样提取文件(`-c` 进行文本转换)。 (2认同)
  • 我认为@Myles 的答案更优雅,因为它不需要输出重定向并且保留了文件属性。 (2认同)

小智 34

更简单的版本:

unzip ARCHIVE_NAME PATH_OF_FILE_INSIDE_ARCHIVE
Run Code Online (Sandbox Code Playgroud)

这将PATH_OF_FILE_INSIDE_ARCHIVE在当前目录中重新创建,但只提取指定的文件。

要列出 Zip 存档中的所有文件:

unzip -l ARCHIVE_NAME
Run Code Online (Sandbox Code Playgroud)


Cam*_*mer 10

在 macOS 上,默认使用Info-Zip

首先列出文件以找到您想要的

unzip -l my.zip
Run Code Online (Sandbox Code Playgroud)

然后从存档中提取文件

unzip my.zip annoying/path/to/file/in/zip
Run Code Online (Sandbox Code Playgroud)

与 -p 结合用于标准输出

unzip -p my.zip annoying/path/to/file/in/zip >./file
Run Code Online (Sandbox Code Playgroud)

或 -j 用于解压到当前目录(丢弃垃圾路径)

unzip -j my.zip annoying/path/to/file/in/zip
Run Code Online (Sandbox Code Playgroud)

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

unzip -d /path/to/dir my.zip annoying/path/to/file/in/zip
Run Code Online (Sandbox Code Playgroud)

如果您想要-d目录中的文件,您可能希望将它与-j选项结合起来。


小智 5

简单使用:

unzip zipfile.zip path/inside/zip/file.txt
Run Code Online (Sandbox Code Playgroud)

它会膨胀文件。

$ 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
Run Code Online (Sandbox Code Playgroud)