在将 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 的手册页。