解压缩文件内容,但不创建存档文件夹

Sco*_*eve 56 zip cp

我有一个包含许多目录、文件等的文件 myarchive.zip。假设这个 myarchive.zip 文件位于名为“b”的目录中。好吧,当我使用“unzip myarchive.zip”命令时,系统会默认创建一个名为“myarchive”的目录,其中包含 zip 文件的内容。我希望系统创建这个“myarchive”目录——我只想将内容提取到目录“b”中。这可能吗?

我现在所做的只是发出一个“cp”命令,将文件从新创建的目录(在本例中为“myarchive”到“b”)复制到我想要的地方。

Sté*_*las 62

我的版本unzip有一个-j选项,以不产生任何目录。

所以

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

将所有文件解压到当前目录,而不恢复zip文件中存储的目录结构。

如果您只想从存档中删除一级目录(提取myarchive/dir/filedir/file,而不是file),则可以使用bsdtarzip除了tar文件之外还支持文件)及其-s选项。

bsdtar -xf /path/to/file.zip -s'|[^/]*/||'
Run Code Online (Sandbox Code Playgroud)

  • 使用 `-j` 时,不会重新创建存档目录结构,所有文件都存放在提取文件夹中。这意味着 *ALL* 子文件夹将被删除。所以如果你有`zip/A/f1`、`zip/A/B/f2`和`zip/A/B/C/f3`,你最终会得到一个包含f1、f2、f3的文件夹。如果您在不同的子文件夹中有同名的文件,这会变得很奇怪。通常您只想删除顶部文件夹而不是整个目录结构。 (14认同)
  • @CristianVrabie,这正是我在答案中所说的。我已经为您的要求添加了一个 bsdtar 替代方案。见编辑。 (3认同)

ism*_*ail 9

看起来这对bsdtar来说真的很简单:

bsdtar --strip-components=1 -xvf file.zip


Edu*_*scu 7

接受的答案没有指定如何做,正如您在问题中所说,如果您仍然想提取到特定文件夹而不使用存储在 zip 文件中的文件夹路径,您可以使用-j带有-d选项的选项以这种方式:

unzip -j /path/to/file.zip -d other_folder
Run Code Online (Sandbox Code Playgroud)

或者对于你的情况

unzip -j myarchive.zip -d b
Run Code Online (Sandbox Code Playgroud)

  • 你是对的,你可以这样做;但它不会创建子目录,因此您仍然需要合并另一个步骤;我很确定 OP 想要将存档的根目录重命名为另一个名称,但将其余结构保留在该目录下。 (3认同)

小智 7

使用提示可以轻松做到这一点,创建临时文件夹,然后将文件移回当前目录,例如:

unzip myfile.zip -d ./tmp
mv ./tmp/*/* .
Run Code Online (Sandbox Code Playgroud)