Linux如何压缩文件夹 zip命令示例

时间:2020-01-09 10:39:58  来源:igfitidea点击:

Linux Zip命令示例

在本教程中,将介绍各种Unix和Linux zip命令示例和方案,以了解"如何压缩文件夹"和"如何创建压缩文件"。

zip是用于Unix,VMS,MSDOS,OS/2,Windows 9x/NT/XP,Minix,Atari,Macintosh,Amiga和Acorn RISC OS的压缩和文件打包实用程序。

前提条件:

在Linux或者Unix中压缩文件夹并创建zip文件之前,我们必须安装zip和unzip实用程序。

说明:

在RHEL系统上,我们必须具有RHN的有效订阅,或者我们可以配置本地脱机存储库,通过该本地脱机存储库,yum软件包管理器可以安装提供的rpm及其依赖项。

安装zip

在某些Linux和Unix变体中,默认情况下将zip与操作系统一起安装。
我们还可以使用yum手动安装zip实用程序

# yum install zip

安装解压缩

同样,要能够在Linux或者Unix中解压缩文件和文件夹,我们将需要解压缩实用程序

# yum install zip

1.如何压缩包含多个文件的文件夹Linux

在这个Linux zip命令示例中,我们将学习"如何压缩包含多个文件的文件夹"或者当前工作目录中的所有文件,并将归档文件存储在同一位置。

列出我们要使用ls命令压缩的文件

# ls -lh
total 332K
-r--r--r--. 1 root root 129K Oct 19 00:14 bc-1.07.1-5.el8.x86_64.rpm
-r--r--r--. 1 root root  45K Oct 19 00:14 biosdevname-0.7.3-2.el8.x86_64.rpm
-r--r--r--. 1 root root 150K Oct 19 00:14 blktrace-1.2.0-9.el8.x86_64.rpm

让我们以这个Linux zip命令示例为例。
其中我们将压缩多个文件,或者将当前工作目录中的所有文件都压缩。

# zip rpms.zip *
  adding: bc-1.07.1-5.el8.x86_64.rpm (deflated 10%)
  adding: biosdevname-0.7.3-2.el8.x86_64.rpm (deflated 24%)
  adding: blktrace-1.2.0-9.el8.x86_64.rpm (deflated 9%)

验证新创建的zip文件(rpms.zip)

# ls -lh rpms.zip
total 620K
-rw-r--r--. 1 root root 287K Oct 19 00:18 rpms.zip

现在,在最后一个zip命令示例中,我们将/tmp/files目录中存在的所有文件都存档了。
现在,我希望压缩除一个或者某些选定文件以外的所有文件。
在这种情况下,我们必须提供要归档的文件的名称,因此zip将仅考虑那些文件进行压缩和归档。

# zip rpms.zip bc-1.07.1-5.el8.x86_64.rpm biosdevname-0.7.3-2.el8.x86_64.rpm
  adding: bc-1.07.1-5.el8.x86_64.rpm (deflated 10%)
  adding: biosdevname-0.7.3-2.el8.x86_64.rpm (deflated 24%)

因此,现在我们的归档文件仅包含两个文件,这些文件作为输入提供,并且归档文件存储在同一路径中。

2.如何通过排除某些文件来创建一个zip文件

使用-x或者--exclude压缩所有文件(某些文件除外)以排除在Linux或者Unix中压缩和存档的文件

下面的Linux zip命令示例将显示如何使用除某些文件之外的所有文件创建一个zip文件。

# zip /tmp/test_archive.zip * -x bc-1.07.1-5.el8.x86_64.rpm
  adding: biosdevname-0.7.3-2.el8.x86_64.rpm (deflated 24%)
  adding: blktrace-1.2.0-9.el8.x86_64.rpm (deflated 9%)

要使用所有正则表达式创建一个包含所有文件的zip文件夹,此处将排除所有以bc开头的文件名

# zip /tmp/test_archive.zip * -x bc*.rpm
  adding: biosdevname-0.7.3-2.el8.x86_64.rpm (deflated 24%)
  adding: blktrace-1.2.0-9.el8.x86_64.rpm (deflated 9%)

通过排除多个文件来创建zip文件夹

# zip /tmp/test_archive.zip * -x bc*.rpm biosdevname-0.7.3-2.el8.x86_64.rpm
  adding: blktrace-1.2.0-9.el8.x86_64.rpm (deflated 9%)

同样,我们也可以使用-r压缩所有文件夹并排除某些目录来压缩目录

3.如何通过压缩目录和子目录来压缩文件夹

默认情况下,zip命令将仅压缩文件。
如果我们尝试压缩目录,则可能会得到以下输出

# zip /tmp/test_archive.zip  /tmp/files
  adding: tmp/files/(stored 0%)

如我们所见,存储的内容为0%。
那么`如何压缩文件夹或者目录?

使用-r或者--recurse-paths`在Linux或者Unix中压缩文件夹,并使用Linux zip命令示例递归压缩目录结构:

# zip /tmp/test_archive.zip -r /tmp/files
updating: tmp/files/(stored 0%)
  adding: tmp/files/blktrace-1.2.0-9.el8.x86_64.rpm (deflated 9%)
  adding: tmp/files/biosdevname-0.7.3-2.el8.x86_64.rpm (deflated 24%)
  adding: tmp/files/bc-1.07.1-5.el8.x86_64.rpm (deflated 10%)

4.如何显示zip存档内容

我们可以使用-dc或者--display-counts显示正在运行的zip文件条目数。
查看下面的Linux zip命令示例,以列出zip归档文件内容而不进行提取。

# zip -dc rpms.zip *
  0/ 3   adding: bc-1.07.1-5.el8.x86_64.rpm (deflated 10%)
  1/ 2   adding: biosdevname-0.7.3-2.el8.x86_64.rpm (deflated 24%)
  2/ 1   adding: blktrace-1.2.0-9.el8.x86_64.rpm (deflated 9%)
# ls -lh rpms.zip
-rw-r--r--. 1 root root 287K Nov  2 12:41 rpms.zip

5.如何使用密码保护对文件夹进行压缩

我们可以压缩文件夹,也可以使用-e或者--encrypt密码保护压缩文件。
使用此参数,我们可以创建一个带有加密密码的zip文件。
让我们使用这个Linux zip命令示例来更好地理解这一点:

# zip -e rpms.zip *
Enter password:
Verify password:
  adding: bc-1.07.1-5.el8.x86_64.rpm (deflated 10%)
  adding: biosdevname-0.7.3-2.el8.x86_64.rpm (deflated 24%)
  adding: blktrace-1.2.0-9.el8.x86_64.rpm (deflated 9%)

现在,"如何解压缩文件?"如果我们尝试解压缩到目录,则压缩文件将提示输入密码。
没有密码,我们将无法解压缩到目录。

# unzip rpms.zip
Archive:  rpms.zip
[rpms.zip] bc-1.07.1-5.el8.x86_64.rpm password:
  inflating: bc-1.07.1-5.el8.x86_64.rpm
  inflating: biosdevname-0.7.3-2.el8.x86_64.rpm
  inflating: blktrace-1.2.0-9.el8.x86_64.rpm

6.如何更新或者修改zip存档中的现有文件

我们可以使用-f或者--freshen来更新或者修改zip文件的内容。
-f替换(刷新)zip归档文件中的现有条目,除非其修改的时间比zip文件中已有的版本更新,与更新选项(-u)不同,这不会添加不存在的文件。
已在zip存档中。

我们可以在此处修改zip文件的内容。

# touch test_file.txt
# echo "First Line" >> test_file.txt
# cat test_file.txt
First Line
# zip /tmp/test_archive.zip test_file.txt
  adding: test_file.txt (stored 0%)

现在将更多内容添加到现有文件中

# echo "Second Line" >> test_file.txt
# zip /tmp/test_archive.zip -f test_file.txt
freshening: test_file.txt (deflated 13%)

重要的提示:

由于存储在zip归档文件中的路径始终是相对的,因此该命令应该从运行原始zip命令的目录中运行,以更新或者修改zip文件的内容。

7.如何将文件添加到现有的zip存档中

如何将文件添加到现有的zip存档中,而不是创建新的zip存档。
如果此操作失败,则zip尝试将存档恢复到其原始状态。
如果还原失败,则存档可能已损坏。
如果没有现有存档,或者必须更新或者删除至少一个zip存档成员,则忽略此选项。

在我先前的Linux zip命令示例中,我创建了一个zip档案/tmp/test_archive.zip
其中我们将新文件添加到相同的zip存档中

# zip /tmp/test_archive.zip -g *.rpm
  adding: bc-1.07.1-5.el8.x86_64.rpm (deflated 10%)
  adding: biosdevname-0.7.3-2.el8.x86_64.rpm (deflated 24%)
  adding: blktrace-1.2.0-9.el8.x86_64.rpm (deflated 9%)

8.如何列出不压缩的zip存档内容

我们也可以使用-sf列出zip压缩文件的内容,而无需将其解压缩到目录。
例如,我们需要检查档案中是否存在文件,因此无需解压缩到目录,就可以在输出中列出zip文件的内容,并使用其他正则表达式和工具来grep我们要查找的文件。

# zip -sf /tmp/test_archive.zip
Archive contains:
  test_file.txt
  bc-1.07.1-5.el8.x86_64.rpm
  biosdevname-0.7.3-2.el8.x86_64.rpm
  blktrace-1.2.0-9.el8.x86_64.rpm
Total 4 entries (330459 bytes)

9.如何创建不带完整路径的zip文件(仅存储文件名)

默认情况下,当我们创建一个zip存档时,它会存储存档内容的相对路径。
让我们以这个Linux zip命令示例为例,该示例存储文件的相对路径:

# zip /tmp/test_archive.zip /tmp/files/*
  adding: tmp/files/bc-1.07.1-5.el8.x86_64.rpm (deflated 10%)
  adding: tmp/files/biosdevname-0.7.3-2.el8.x86_64.rpm (deflated 24%)
  adding: tmp/files/blktrace-1.2.0-9.el8.x86_64.rpm (deflated 9%)
  adding: tmp/files/test_file.txt (deflated 13%)

这里列出了test_archive的内容,因为我们看到相对路径与文件名一起存储

# zip -sf /tmp/test_archive.zip
Archive contains:
  tmp/files/bc-1.07.1-5.el8.x86_64.rpm
  tmp/files/biosdevname-0.7.3-2.el8.x86_64.rpm
  tmp/files/blktrace-1.2.0-9.el8.x86_64.rpm
  tmp/files/test_file.txt
Total 4 entries (330459 bytes)

因此,要在Linux中创建一个不带完整路径的zip文件,而仅将文件名存储在zip归档文件中,我们使用-j或者--junk-paths。
这将创建一个没有文件相对路径的zip归档文件,并且仅存储文件名(替换路径),并且不存储目录名。
例如:

# zip /tmp/test_archive.zip -j /tmp/files/*
  adding: bc-1.07.1-5.el8.x86_64.rpm (deflated 10%)
  adding: biosdevname-0.7.3-2.el8.x86_64.rpm (deflated 24%)
  adding: blktrace-1.2.0-9.el8.x86_64.rpm (deflated 9%)
  adding: test_file.txt (deflated 13%)

列出并验证zip存档内容。

# zip -sf /tmp/test_archive.zip
Archive contains:
  bc-1.07.1-5.el8.x86_64.rpm
  biosdevname-0.7.3-2.el8.x86_64.rpm
  blktrace-1.2.0-9.el8.x86_64.rpm
  test_file.txt
Total 4 entries (330459 bytes)

10.归档后如何创建一个zip文件和删除原始文件

  • 默认情况下,创建zip文件时,它会在创建存档后保留原始文件和文件夹,

  • 但是,归档完成后,我们也可以使zip删除原始文件。

  • 代替复制,将指定文件移动到zip存档中。

  • 实际上,这将在创建指定的zip归档文件后删除原始目标目录/文件。

  • 如果目录在删除文件后变为空,则目录也会被删除。

  • 在zip成功创建档案之前,不会执行任何删除操作。

这对于节省磁盘空间很有用,但是有潜在的危险,因此建议我们在存档后将zip删除原始文件之前,将它与-T结合使用以测试存档。
在此,我们创建一个zip存档,然后删除该文件夹中的原始文件。

# zip /tmp/test_archive.zip -mT /tmp/files/*
  adding: tmp/files/bc-1.07.1-5.el8.x86_64.rpm (deflated 10%)
  adding: tmp/files/biosdevname-0.7.3-2.el8.x86_64.rpm (deflated 24%)
  adding: tmp/files/blktrace-1.2.0-9.el8.x86_64.rpm (deflated 9%)
  adding: tmp/files/test_file.txt (deflated 13%)
test of /tmp/test_archive.zip OK

压缩文件夹后,请验证存储在`/tmp/files下的内容。
因此,按预期进行存档后,会从源位置中删除"原始文件"。

# ls -l /tmp/files/
total 0

类似地,要存储/tmp/files的全部内容(包括源目录),请使用-r指令

# zip /tmp/test_archive.zip -rmT /tmp/files
updating: tmp/files/bc-1.07.1-5.el8.x86_64.rpm (deflated 10%)
updating: tmp/files/biosdevname-0.7.3-2.el8.x86_64.rpm (deflated 24%)
updating: tmp/files/blktrace-1.2.0-9.el8.x86_64.rpm (deflated 9%)
updating: tmp/files/(stored 0%)
test of /tmp/test_archive.zip OK

不出所料,归档后我们的源目录也会被删除

# ls -l /tmp/files
ls: cannot access '/tmp/files': No such file or directory

11.如何压缩更高压缩级别的文件夹

当我们压缩文件夹时,默认的压缩级别是-6. zip命令支持" [0-9]"的压缩级别,其中" 0"表示"无压缩",而" -9"表示"最高(最大)压缩"。
我们将执行基本压缩并监视时差

重要的提示:

压缩速度取决于各种因素,包括但不限于系统CPU类型,可用的处理器和内存,磁盘读写速度,可用的可用磁盘IO,要归档的单个文件的数量和大小。
我正在使用具有2GB RAM和单核处理器(虚拟)的RHEL 8虚拟机。

在默认压缩级别下,当我们创建一个zip文件夹时,压缩工具以1668 rpm的速度压缩大约需要32分钟。

# time zip -r /tmp/files/archive.zip  BaseOS/*
real    0m32.177s
user    0m28.786s
sys     0m1.715s

源位置的原始大小为

# du -sch /mnt/BaseOS
907M    /mnt/BaseOS
907M    total

压缩后为842M,所以我们节省了~65M

# du -sch /tmp/files/archive.zip
842M    /tmp/files/archive.zip
842M    total

我们将压缩级别提高到" -9"并创建一个zip文件夹,该文件夹被视为最高或者最大压缩级别。

# time zip -q -r -9 /tmp/files/archive.zip  BaseOS/*
real    0m35.621s
user    0m32.265s
sys     0m1.081s

现在有了更高的压缩级别,zip花费了额外的3秒来完成压缩,但是我们在存档中总共只节省了1MB的空间,因此与投资时间相比,优势并不是很高。

# du -sch /tmp/files/archive.zip
841M    /tmp/files/archive.zip
841M    total

12.如何在两个zip存档之间复制文件

我们还可以使用-U或者--copy-entries参数将文件从一个zip存档复制到另一个zip存档,而无需提取。

还需要--out选项来指定与输入档案不同的输出文件。

在此Linux zip命令示例中,我们在两个zip归档文件之间复制文件,我有一个包含以下内容的输入归档文件

# zip -sf /tmp/input_archive.zip
Archive contains:
  blktrace-1.2.0-9.el8.x86_64.rpm
  bc-1.07.1-5.el8.x86_64.rpm
  biosdevname-0.7.3-2.el8.x86_64.rpm
Total 3 entries (330436 bytes)

我将其中一个rpm复制到另一个新档案

# zip  /tmp/input_archive.zip "bc-1.07.1-5.el8.x86_64.rpm" --copy  --out /tmp/output_archive.zip
 copying: bc-1.07.1-5.el8.x86_64.rpm

验证output_archive的内容

# zip -sf /tmp/output_archive.zip
Archive contains:
  bc-1.07.1-5.el8.x86_64.rpm
Total 1 entries (132040 bytes)

如果命令行上没有输入文件,并且使用了" --out",则假定为复制模式:

# zip /tmp/input_archive.zip --out /tmp/output_archive.zip
 copying: blktrace-1.2.0-9.el8.x86_64.rpm
 copying: bc-1.07.1-5.el8.x86_64.rpm
 copying: biosdevname-0.7.3-2.el8.x86_64.rpm

13. Linux zip目录并从zip存档中删除文件

在Linux zip目录中,并使用-d或者--delete指令,我们可以从zip归档文件中删除或者删除文件。

让我们以这个Linux zip命令示例为例。
这里我有一个Linux zip归档文件,其中包含以下内容

# zip -sf /tmp/test_archive.zip
Archive contains:
  blktrace-1.2.0-9.el8.x86_64.rpm
  bc-1.07.1-5.el8.x86_64.rpm
  biosdevname-0.7.3-2.el8.x86_64.rpm
Total 3 entries (330436 bytes)

因此,要从zip存档中删除文件,我将从现有的zip存档中删除两个文件,而无需将其解压缩到目录

# zip -d /tmp/test_archive.zip  bc-1.07.1-5.el8.x86_64.rpm blktrace-1.2.0-9.el8.x86_64.rpm
deleting: blktrace-1.2.0-9.el8.x86_64.rpm
deleting: bc-1.07.1-5.el8.x86_64.rpm

验证档案的内容

# zip -sf /tmp/test_archive.zip
Archive contains:
  biosdevname-0.7.3-2.el8.x86_64.rpm
Total 1 entries (45268 bytes)

14. Linux zip文件夹并保留符号链接

对于UNIX和VMS(V8.3及更高版本),请使用-y或者--symlinks创建一个zip文件夹,并将符号链接存储并保留在zip归档文件中。

这样可以避免压缩文件中包含文件的多个副本,因为zip会压缩目录树并直接和通过链接访问文件。

让我们以这个Linux zip命令示例为例。
其中我在根目录的主文件夹中创建了一个虚拟文件,并添加了一些内容。

# echo "This is a test file" >> /root/test_file

创建到该虚拟文件的符号链接

# ln -s /root/test_file test_link

验证符号链接

# ls -l
total 332
-r--r--r--. 1 root root 132040 Nov  2 13:50 bc-1.07.1-5.el8.x86_64.rpm
-r--r--r--. 1 root root  45268 Nov  2 13:50 biosdevname-0.7.3-2.el8.x86_64.rpm
-r--r--r--. 1 root root 153128 Nov  2 13:50 blktrace-1.2.0-9.el8.x86_64.rpm
lrwxrwxrwx. 1 root root     15 Nov  2 14:33 test_link -> /root/test_file

接下来,使用-y或者--symlinks参数创建一个包含symlink的zip文件夹,以使zip保留符号链接

# zip /tmp/test_archive.zip  -y *
  adding: bc-1.07.1-5.el8.x86_64.rpm (deflated 10%)
  adding: biosdevname-0.7.3-2.el8.x86_64.rpm (deflated 24%)
  adding: blktrace-1.2.0-9.el8.x86_64.rpm (deflated 9%)
  adding: test_link (stored 0%)

我将创建一个虚拟位置以提取档案并验证符号链接

# cd /tmp/test
# mv /tmp/test_archive.zip .

使用unzip命令解压缩到目录

使用unzip将新创建的存档解压缩到目录中,以确保zip能够保存和存储符号链接

# unzip test_archive.zip
Archive:  test_archive.zip
  inflating: bc-1.07.1-5.el8.x86_64.rpm
  inflating: biosdevname-0.7.3-2.el8.x86_64.rpm
  inflating: blktrace-1.2.0-9.el8.x86_64.rpm
    linking: test_link               -> /root/test_file
finishing deferred symbolic links:
  test_link              -> /root/test_file

因此,使用-y,我们使zip保留符号链接

# ls -l
total 620
-r--r--r--. 1 root root 132040 Nov  2 13:50 bc-1.07.1-5.el8.x86_64.rpm
-r--r--r--. 1 root root  45268 Nov  2 13:50 biosdevname-0.7.3-2.el8.x86_64.rpm
-r--r--r--. 1 root root 153128 Nov  2 13:50 blktrace-1.2.0-9.el8.x86_64.rpm
-rw-r--r--. 1 root root 293196 Nov  2 14:34 test_archive.zip
lrwxrwxrwx. 1 root root     15 Nov  2 14:36 test_link -> /root/test_file

接下来,验证符号链接的内容。

# cat test_link
This is a test file

15.如何创建一个zip文件并使用bzip2压缩

我们可以使用bzip2压缩创建一个zip文件。
使用-Z或者--compression-method设置默认的压缩方法。
当前,zip支持的主要方法是存储和放气。
压缩方法可以设置为:

  • store-设置压缩方式来存储,强制zip存储没有压缩的条目。
    通常,这比压缩条目要快,但不会节省空间。
    这与使用-0(压缩级别为零)相同。

  • deflate-这是zip的默认方法。
    如果zip确定存储胜于通缩,则将存储该条目。

  • bzip2-如果编译了bzip2支持,此压缩方法也将可用。

重要的提示:

当前只有Linux和Unix中的某些现代unzip实用程序支持bzip2压缩方法,因此在使用此方法依赖存档之前,请测试将要使用的unzip。

# zip -Z bzip2 /tmp/test_archive.zip *
  adding: bc-1.07.1-5.el8.x86_64.rpm (bzipped 9%)
  adding: biosdevname-0.7.3-2.el8.x86_64.rpm (bzipped 22%)
  adding: blktrace-1.2.0-9.el8.x86_64.rpm (bzipped 7%)

使用解压缩命令提取内容

使用解压缩将内容提取到目录

# unzip test_archive.zip
Archive:  test_archive.zip
 bunzipping: bc-1.07.1-5.el8.x86_64.rpm
 bunzipping: biosdevname-0.7.3-2.el8.x86_64.rpm
 bunzipping: blktrace-1.2.0-9.el8.x86_64.rpm

16.如何压缩文件夹,以后再分割zip存档

  • 如何压缩文件夹并启用创建拆分zip归档文件并使用-s或者--split-size设置拆分大小。

  • 在Linux和Unix中,分割的zip档案文件是可以分割成许多文件的档案文件。

  • 创建zip归档文件后,如果归档文件的大小达到指定的拆分大小,则将关闭该拆分并打开下一个拆分。

  • 通常,除最后一个分割以外,所有分割都是分割大小,最后一个将是剩余的大小。

  • 如果整个档案小于拆分的大小,则会创建一个单文件档案。

  • 分割大小是一个数字,可以选择后面跟一个乘数。

  • 当前该数字必须是整数。

  • 乘数当前可以是" k"(千字节)," m"(兆字节)," g"(千兆字节)或者" t"(兆字节)之一。

  • 由于最小拆分大小为64k,因此不带乘数的数字默认为兆字节

让我们使用这个Linux zip命令示例创建一个具有split enable的zip文件夹。
我的Packages目录中的文件大小为902MB。
其中我将创建zip存档

# zip -q -s 200m /tmp/test_archive *

我们所看到的最后一个文件为36MB,而其他所有归档文件均为200MB,我们已将其用作拆分大小

# ls -lh /tmp/test_archive.z*
-rw-r--r--. 1 root root 200M Nov  2 15:03 /tmp/test_archive.z01
-rw-r--r--. 1 root root 200M Nov  2 15:03 /tmp/test_archive.z02
-rw-r--r--. 1 root root 200M Nov  2 15:03 /tmp/test_archive.z03
-rw-r--r--. 1 root root 200M Nov  2 15:04 /tmp/test_archive.z04
-rw-r--r--. 1 root root  36M Nov  2 15:04 /tmp/test_archive.zip