终端在默认目录之外解压

终端在默认目录之外解压

在将 CMS 部署到远程服务器时,使用终端命令“unzip”似乎非常有用,因为您可以传输 zip 文件并将其远程解压缩。但是,我找不到将所有文件直接解压缩到 .zip 文件所在目录根目录的方法。默认情况下,它会创建一个与 .zip 文件同名的文件夹,并将文件提取到此文件夹中,之后我需要执行 mv 命令将文件夹的内容移动到根目录。

我可以使用 unzip 一步完成此操作吗?

答案1

对你的问题的具体回答是否定的。OS X 附带的 unzip 无法动态更改 zip 中的目录。但需要注意的一点是,zip 不会“创建目录”。它是档案的一部分。如果您控制创建过程,正确创建的 zip 档案将不会出现此问题:

$ ls -l
total 0
-rw-r--r--  1 bsmith  staff  0 Sep 30 22:01 b
-rw-r--r--  1 bsmith  staff  0 Sep 30 22:01 c
$ zip -r a.zip .
  adding: b (stored 0%)
  adding: c (stored 0%)
$ cd ../b
$ unzip ../a/a.zip
Archive:  ../a/a.zip
 extracting: b                       
 extracting: c                       
$ ls -l
total 0
-rw-r--r--@ 1 bsmith  staff  0 Sep 30 22:01 b
-rw-r--r--@ 1 bsmith  staff  0 Sep 30 22:01 c

答案2

尝试使用 -d 参数指定要提取到的根目录。您可以使用“。”或“~”作为目录,避免所有内容都放在带有 zip 文件名的默认目录中的情况。以下是文档:

[-d exdir] 可选目录,用于将文件提取到其中。
默认情况下,所有文件和子目录都在当前目录中重新创建;-d 选项允许在任意目录中提取(始终假设用户有权写入目录)。此选项不必出现在命令行的末尾;它也可以在 zipfile 规范之前(使用正常选项)、zipfile 规范之后或文件和 -x 选项之间接受。选项和目录可以连接在一起,中间不加任何空格,但请注意,这可能会导致正常的 shell 行为被抑制。特别是,-d ~'' (tilde) is expanded by Unix C shells into the name of the user's home directory, but-d~'' 被视为当前目录的文字子目录 ``~''。

答案3

您可以使用 -j 标志来实现相同的效果。

例子:

$ mkdir Testing && cd Testing
~/Testing $ touch one two three four five
~/Testing $ cd ..
$ zip -r Testing Testing
$ ls -la | grep Testing


drwxr-xr-x   7 username  staff    238 Aug  2 20:03 Testing
-rw-r--r--   1 username  staff    924 Aug  2 20:03 Testing.zip

现在,

$ rm -rf Testing
$ unzip -j Testing.zip
$ ls -la

-rw-r--r--   1 username  staff     0 Aug  2 20:03 five
-rw-r--r--   1 username  staff     0 Aug  2 20:03 four
-rw-r--r--   1 username  staff     0 Aug  2 20:03 one
-rw-r--r--   1 username  staff     0 Aug  2 20:03 three
-rw-r--r--   1 username  staff     0 Aug  2 20:03 two

这将帮助您提取档案的内容而不是包含的文件夹。

$ man unzip

-j     junk paths.  The archive's directory structure is not recreated;
       all files are deposited in the extraction directory 
       (by default, the current one).

有关更多信息,请参阅 unzip 的手册页。

相关内容