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


37

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

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


8
默认情况下,unzip不创建目录。您的zip文件可能在其顶层目录中。
克里斯·

3
您可以使用mv代替cpmv archive/* .; rmdir archive/或类似。
frostschutz

Answers:


45

我的版本unzip具有-j不创建任何目录的选项。

所以

unzip -j /path/to/file.zip

将所有文件提取到当前目录中,而无需恢复zip文件中存储的目录结构。

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

bsdtar -xf /path/to/file.zip -s'|[^/]*/||'

8
使用-j归档文件时,不会重新创建目录结构,所有文件都存放在提取文件夹中。这意味着将删除所有子文件夹。所以,如果你会zip/A/f1zip/A/B/f2zip/A/B/C/f3你最终会与F1,F2,F3一个文件夹。如果在不同的子文件夹中有相同名称的文件,它将变得很时髦。通常,您只想删除顶部文件夹而不是整个目录结构。
克里斯蒂安·克拉比

3
@CristianVrabie,好吧,这正是我在回答中所说的。我为您的要求添加了bsdtar替代方案。参见编辑。
斯特凡Chazelas


1

正如您在问题中所说,接受的答案未指定操作方法,如果您仍要提取到特定文件夹而不使用zip文件中存储的文件夹路径,则可以通过这种方式使用-joption -d选项:

unzip -j /path/to/file.zip -d other_folder

还是你的情况

unzip -j myarchive.zip -d b

2
你是对的,你可以做到。但它不会创建子目录,因此您仍然必须合并另一步;我很确定OP希望将存档的根目录重命名为另一个名称,但将其余结构保留在该目录下。
Pryftan

-1

如果Performing unzip myarchive.zip产生了一个myarchive包含所有内容的目录,则意味着zip文件的创建者实际上对该目录执行了zip。

创建所需内容的唯一方法是在执行unzip以下操作后将所有内容移到目录外:

[user@host]:some/path/b$ unzip myarchive.zip

[user@host]:some/path/b$ ls{ 显示目录myarchive }

[user@host]:some/path/b$ mv myarchive/* .

[user@host]:some/path/b$ rm -R myarchive

[user@host]:some/path/b$ ls{ 显示myarchive的第一级(直接在中b }


1
您还需要mv myarchive/.* .移动所有隐藏的文件,例如.gitignore和.htaccess。
Kinjal Dixit

1
@KinjalDixit那也是我的想法;正如Kinjai所指出的,Antoine在您的示例中存在一个致命缺陷:因为您使用了rm -R并且因为您没有使用,所以ls -a没有显示是否有任何点文件。现在,当您运行rm -R并且有点文件时会发生什么?您尚未复制它们,因此它们丢失了。您确实应该解决该问题,并可能解释其中的区别,因为它会使新手大为困扰。考虑一下:如果不是档案馆,该怎么办?还是如果将它们添加到命令中以将存档解压缩后将其删除,该怎么办?
Pryftan

Otoh rmdir将确保首先将其清空...但是,如果用户不了解点文件,则会使它们感到困惑。
Pryftan
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.