Linux如何压缩文件夹 zip命令示例
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