【Geek之路】Linux相关命令

Posted by ShawnD on June 19, 2020

创建sudo用户

创建新用户

sudo adduser username

如果命名不符合规范, –force-badname

把用户添加到sudo组

sudo usermod -aG sudo username

删除用户

sudo userdel -r username

CPU

lscpu:显示cpu架构信息

cat /proc/cpuinfo:查看CPU详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看物理CPU个数
cat /proc/cpuinfo | grep "physical id" | sort | uniq

# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo | grep "cpu cores" | uniq

# 查看每个物理CPU中线程的个数
cat /proc/cpuinfo | grep "siblings" | uniq

# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"

# 查看CPU型号
cat /proc/cpuinfo | grep "model name" | uniq

内存

查看/proc/meminfo或者使用free命令。free命令就是从meminfo中获取的信息。一般情况下,使用free就能得到我们想知道的信息:

free -m

训练时我们经常需要检测内存的占用情况,使用free命令即可,具体用法如下

watch free -h

-h指的是human,该选项会将内存用量转换为以GB为单位,方便直观.

硬盘

lsblk:blk是block的缩写。列出块设备

1
2
3
4
5
6
7
8
9
10
11
 [xxx@localhost ~]$ lsblk
NAME                        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                          11:0    1 1024M  0 rom  
sdb                           8:16   0  100G  0 disk 
└─sdb1                        8:17   0  100G  0 part /data
sda                           8:0    0   60G  0 disk 
├─sda1                        8:1    0  500M  0 part /boot
└─sda2                        8:2    0 59.5G  0 part 
  ├─VolGroup-lv_root (dm-0) 253:0    0   50G  0 lvm  /
  ├─VolGroup-lv_swap (dm-1) 253:1    0    4G  0 lvm  [SWAP]
  └─VolGroup-lv_home (dm-2) 253:2    0  5.6G  0 lvm  /home

df:查看硬盘使用情况

1
2
3
4
5
6
7
 [xxx@localhost ~]$ df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root   50G  1.7G   46G   4% /
tmpfs                         3.9G     0  3.9G   0% /dev/shm
/dev/sda1                     485M   39M  421M   9% /boot
/dev/mapper/VolGroup-lv_home  5.5G  165M  5.1G   4% /home
/dev/sdb1                      99G  188M   94G   1% /data

挂载硬盘

分区:fdisk

fdsk [-l] 设备名称

d删除一个分区

n新增一个分区

p列出当前的分区

删除分区

先把已有的分区删掉, 再重新建, 避免不必要的bug。

将新分区的文件系统格式化为ext4类型

sudo mkfs -t ext4 /dev/sdx1

查看磁盘块ID

blkid

编辑/etc/fstab

sudo vim /etc/fstab

1
UUID=0fa95857-d952-41c8-838a-ca3dea2d57ad /home/ShawnD/4t1     ext4    errors=remount-ro 0       1

重启

修改文件夹权限给用户

sudo chown -R 你的用户名 /media/datadisk

某次挂载一直失败, 寻找原因

  1. 打开系统自带的“Disks”软件
  2. 点击你想自动挂载的硬盘
  3. 点击Additional Partition Options图标

  1. 选择Edit Mount Options,把User Session Defaults设成Off,并确定Mount at system startup已经选中即可。

就是这里出的问题, 它设计到fstab是否有效。

GPU

nvidia-smi

进程

ps -l 列出与本次登录有关的进程信息;

ps -aux 查询内存中进程信息;

ps -aux | grep *** 查询***进程的详细信息;

top 查看内存中进程的动态信息;

kill -9 pid 杀死进程。

批量杀死进程

1
ps -ef | grep tools/train.py | grep -v grep | awk '{print $2}' | xargs kill -9 

screen命令

进入screen会话后,可在会话中创建多个窗口(window),并对窗口进行管理,管理命令以ctrl + a开头。

在已有screen会话中创建新的窗口:

  1. 在当前screen窗口中键入C-a c,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口

  2. C-a n,即Ctrl键+a键,之后再按下n键, 切换到下一个窗口; C-a p,即Ctrl键+a键,之后再按下p键, 切换到前一个窗口

  3. ctrl a + k 关闭当前窗口

  4. 常用screen参数:

screen -S yourname -> 新建一个叫yourname的session

screen -ls -> 列出当前所有的session

screen -r yourname -> 回到yourname这个session

screen -d yourname -> 远程detach某个session

screen -d -r yourname -> 暂时断开当前session并回到yourname这个session

screen -D -r yourname-> 暂停当前的session,并logout,再链接yourname这个session

用screen -d命令detached 会话后, 如何杀死会话:

screen -S 23536 -X quit

ps: 暂时断开(detach)screen会话

添加和删除 ppa 源

添加 ppa 源

添加PPA源:

1
sudo add-apt-repository ppa:app-name/ppa-name

更新:

1
sudo apt update

删除 ppa 源

删除PPA源:

1
sudo add-apt-repository -r ppa:app-name/ppa-name

更新:

1
sudo apt update

apt安装卸载软件

查看已安装的软件

1
apt list --installed

dpkg安装卸载软件

安装

1
sudo dpkg -i 软件名

卸载

1
sudo dpkg -r 软件名

查询已安装的软件

1
dpkg --get-selections

dpkg 安装缺少依赖的方法

1
 sudo apt-get -f -y install

压缩与解压

tar

tar是把文件打成一个包,并不压缩;

gz是用gzip把打成包的.tar文件压缩;

所以成了一个.tar.gz的文件

压缩

1
# tar cvfz backup.tar.gz /xxx/
  • c, –create, create a new archive
  • v, –verbose, verbosely list files processed
  • f, –file [HOSTNAME:]F, use archive file or device F (default /dev/rmt0)
  • z, –gzip, –ungzip, filter the archive through gzip

解压

1
tar -zxvf xxx.tar.gz
  • z, –gzip, –ungzip, filter the archive through gzip
  • x, –extract, –get, extract files from an archive
  • v, –verbose, verbosely list files processed
  • f, –file [HOSTNAME:]F, use archive file or device F (default /dev/rmt0)

Read more: tar,gzip的使用方法

1) 压缩一组文件为tar.gz后缀。

1
2
3
tar cvf backup.tar /etc

gzip -q backup.tar

1
tar cvfz backup.tar.gz /etc/

2) 释放一个后缀为tar.gz的文件。

1
gunzip backup.tar.gz #tar xvf backup.tar

1
tar xvfz backup.tar.gz

3) 用一个命令完成压缩

1
tar cvf - /etc/ | gzip -qc > backup.tar.gz

4) 用一个命令完成释放

1
gunzip -c backup.tar.gz | tar xvf -

5) 如何解开tar.Z的文件?

1
tar xvfz backup.tar.Z

1
uncompress backup.tar.Z #tar xvf backup.tar

6) 如何解开.tgz文件?

1
gunzip backup.tgz

7) 如何压缩和解压缩.bz2的包?

1
bzip2 /etc/smb.conf

这将压缩文件smb.conf成smb.conf.bz2

1
bunzip2 /etc/smb.conf.bz2

这将在当前目录下还原smb.conf.bz2为smb.conf

注:.bz2压缩格式不是很常用,可以man bzip2

8) 如何解压tar.bz2的包?

1
tar   jxf   linux-2.8.18.8.tar.bz2

解压.gz

sudo gunzip filename.gz

端口

查看端口

netstat -a

查看占用端口的进程

sudo lsof -i :1087

iptables 开启指定端口

iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter

netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。

iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。

netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:

网络地址转换(Network Address Translate)

数据包内容修改

以及数据包过滤的防火墙功能

所以说,虽然我们使用service iptables start启动iptables”服务”,但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。

iptables -I INPUT -p tcp –dport 8080 -j ACCEPT

iptables -I OUTPUT -p tcp –sport 8080 -j ACCEPT

给指定ip开启某端口访问权限:

iptables -I INPUT -p tcp –dport 55618 -j DROP

iptables -I INPUT -s 115.28.139.46 -p tcp –dport 55618 -j ACCEPT

iptables -I INPUT -p tcp –dport 2181 -j DROP

iptables -I INPUT -s 127.0.0.1 -p tcp –dport 2181 -j ACCEPT

删除某一条规则: iptables -D INPUT 2

service iptables save

service iptables restart

UFW和iptables的关系

UFW全称为Uncomplicated Firewall,是Ubuntu系统上配置iptables防火墙的工具。UFW提供一个非常友好的命令用于创建基于IPV4,IPV6的防火墙规则。由于Ubuntu下的iptables操作起来比较复杂,依赖关系比较多,所以使用UFW时可以简化很多操作。

修改DNS

怎么找到DNS配置文件

如果你不想看DNS配置的工作原理,你可以直接跳到“如何修改DNS配置文件”。

接下来我们将一步一步说明如何配置自定义的DNS服务器地址。如果你尝试修改/etc/resolv.conf文件,你将会看到文件顶部如下提示。

1
2
3
4
5
6
7
8
9
10
11
12
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients directly to
# all known uplink DNS servers. This file lists all configured search domains.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

提示不要编辑这个文件,这个文件是由man:systemd-resolved(8) 管理,/etc/resolv.conf 是一个动态生成的文件,当你尝试看man的手册页,你会找到另一个配置, 并且注意到下面的语句。

1
2
man systemd-resolved
The DNS servers contacted are determined from the global settings in /etc/systemd/resolved.conf

DNS服务器是从全局设置/etc/systemd/resolved.conf文件读取。现在我们已经找设置DNS服务器的配置文件,我们现在尝试修改它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See resolved.conf(5) for details

[Resolve]
DNS=8.8.8.8
FallbackDNS=223.5.5.5
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#DNSOverTLS=no
#Cache=no-negative
#DNSStubListener=yes
#ReadEtcHosts=yes

在上面的配置文件中,我们修改了DNS=8.8.8.8,FallbackDNS=223.5.5.5。这样修改并不会马上生效,因为这个配置文件是systemd-resolved服务的配置文件,涉及到服务的配置基本上都是需要重启服务才会生效,现在我们执行以下命令重启它。

1
2
sudo systemctl daemon-reload
sudo systemctl restart systemd-resolved.service

代理

terminal 设置代理

1
export http_proxy=http://proxyAddress:port

http的代理端口是12333,想执行wget或者curl来下载国外的东西,可以使用如下命令:

1
export http_proxy=http://127.0.0.1:12333

如果是https那么就经过如下命令:

1
export https_proxy=http://127.0.0.1:12333

terminal 默认代理

编辑~/.bashrc, 在末尾添加

1
2
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"

如果在conda环境, 切换到默认环境

1
source ~/.bashrc

装系统

华硕主板相关

华硕主板进入bios, 按住del健。

在boot选项中,选择Hard Disk Drives启动方式,进入后,可选U盘启动。

工具

首先下载工具Refu: http://rufus.ie/

ssh

安装SSH服务:

sudo apt install openssh-client #本地主机运行此条,实际上通常是默认安装client端程序的
sudo apt install openssh-server #在被连接的服务器运行此条命令安装

启动SSH服务:

sudo /etc/init.d/ssh start

启动后通过以下指令判断SSH服务是否正确启动:

ps -e | grep ssh

bugs

vscode配置远程连接失败:过程试图写入的管道不存在

报错信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[20:46:09.521] Log Level: 3
[20:46:09.530] remote-ssh@0.49.0
[20:46:09.530] win32 x64
[20:46:09.531] SSH Resolver called for "ssh-remote+7b22686f73744e616d65223a2254656e63656e74227d", attempt 1
[20:46:09.532] SSH Resolver called for host: Tencent
[20:46:09.532] Setting up SSH remote "Tencent"
[20:46:09.559] Using commit id "c47d83b293181d9be64f27ff093689e8e7aed054" and quality "stable" for server
[20:46:09.559] Install and start server if needed
[20:46:09.565] Checking ssh with "ssh -V"
[20:46:09.625] > OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
[20:46:09.628] Running script with connection command: ssh -T -D 51303 Tencent bash
[20:46:09.630] Terminal shell path: C:\WINDOWS\System32\cmd.exe
[20:46:09.776] > 
> 
...
> �]0;C:\WINDOWS\System32\cmd.exe�
[20:46:09.776] Got some output, clearing connection timeout
[20:46:09.783] > 
> 
...
[20:46:09.992] > @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> 
[20:46:09.999] > @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
> Someone could be eavesdropping on you right now (man-in-the-middle attack)!     
> It is also possible that a host key has just been changed.
> The fingerprint for the ECDSA key sent by the remote host is
> SHA256:teZb8yKzveqH5iVGOEalepGRmKhWlD2LZLNe0QqOChg.
> Please contact your system administrator.
> Add correct host key in C:\\Users\\bob/.ssh/known_hosts to get rid of this mes
> sage.
> Offending ECDSA key in C:\\Users\\bob/.ssh/known_hosts:14
> ECDSA host key for 106.*.249.* has changed and you have requested strict chec
> king.
> Host key verification failed.
> 过程试图写入的管道不存在。
> 
[20:46:10.332] "install" terminal command done
[20:46:10.332] Install terminal quit with output: 过程试图写入的管道不存在。
[20:46:10.332] Received install output: 过程试图写入的管道不存在。
[20:46:10.334] Stopped parsing output early. Remaining text: 过程试图写入的管道不存在。
[20:46:10.334] Failed to parse remote port from server output
[20:46:10.335] Resolver error: 
[20:46:10.341] ------

解决方案就是把本地的known_hosts的原服务器信息全部删掉(根据IP地址删除),然后重新连接就可以了。

known_hosts在.ssh文件夹下。

sftp

一、适用场景

  我们平时习惯了使用 ftp 来上传下载文件,尤其是很多 Linux 环境下,我们一般都会通过第三方的SSH 工具连接到 Linux,但是当我们需要传输文件到 Linux 服务器当中,很多人习惯用 ftp 来传输,其实 Linux 默认是不提供 ftp 的,需要你额外安装 FTP 服务器。而且 ftp 服务器端会占用一定的 VPS 服务器资源。尤其笔者更建议使用 sftp 代替 ftp.

  主要原因:① 可以不用额外安装任何服务器端程序;② 会更省系统资源;③ SFTP 使用加密传输认证信息和传输数据,相对来说会更安全;④ 也不需要单独配置,对新手来说比较简单(开启 SSH 默认就开启了 STFP)。

二、主要区别

  FTP 是一种文件传输协议,一般是为了方便数据共享的。包括一个 FTP 服务器和多个 FTP 客户端。FTP 客户端通过 FTP 协议在服务器上下载资源。而 SFTP 协议是在 FTP 的基础上对数据进行加密,使得传输的数据相对来说更安全。但是这种安全是以牺牲效率为代价的,也就是说 SFTP 的传输效率比 FTP 要低(不过现实使用当中,没有发现多大差别)。

安装filezilla

1
sudo apt-get install filezilla

sftp默认的连接端口号是22

安装Nvidia驱动

更换阿里源, 用默认源安装很慢

1
2
3
4
5
6
7
8
9
10
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

在终端输入:ubuntu-drivers devices,可以看到自己的显卡型号以及推荐的驱动版本。

如果没有推荐版本, 添加ppa源

1
sudo add-apt-repository ppa:graphics-drivers/ppa
  • 如果同意安装推荐版本,那我们只需要终端输入:sudo ubuntu-drivers autoinstall 就可以自动安装了。
  • 当然我们也可以使用 apt 命令安装自己想要安装的版本,比如我想安装 340 这个版本号的版本,终端输入:sudo apt install nvidia-340 就自动安装了。
  • 安装过程中按照提示操作,除非你知道每个提示的真实含义,否则所有的提示都选择默认就可以了,安装完成后重启系统,NVIDIA 显卡就可以正常工作了。安装完成后你可以参照https://linuxconfig.org/benchmark-your-graphics-card-on-linux 上的介绍测试你的显卡。

打开摄像头

1
sudo apt-get install guvcview
1
guvcview -d /dev/video

分辨率

查看现有分辨率

1
xrandr

增加新的分辨率模式

1
cvt 1920 1080 #查看具体正确设置

输出为:

Modeline “1920x1080_60.00” 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync

1
2
xrandr --newmode "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync #创建创建分辨率1980X1080
xrandr --addmode HDMI-0 "1920x1080_60.00"#将分辨率 1980 X1080添加值分辨率选项中

注意:此处HDMI-0应于前面xrandr处的输出一致,并不一定是HDMI-0

删除已有分辨率模式

删除已有模式

1
xrandr --rmmode name

给输出设备删除已有模式

1
xrandr --delmode output name

更改分辨率

1
 xrandr -s 1920x1080_60.00    #更改分辨率模式 

快捷键

  • Ctrl+Alt+T 启动终端

显示网速

打开Ubuntu软件中心,搜索netspeed,安装立即生效。

调整字体大小

单击Ubuntu桌面的top-right角處的向下箭頭,然後從以下視圖中單擊設置圖標:

默認情況下,“設置”實用程序在Wi-Fi選項卡中打開。您需要單擊通用訪問選項卡以配置文本大小。

通用訪問視圖如下所示:

将控制台同时输出并保存至文件

在 Linux 终端执行直接 run 代码时,可以在执行命令后加上 2>&1,在保存输出信息到文件的同时,终端仍正常打印信息。

1
python run.py 2>&1 | tee train.log

zip 分卷压缩和合并解压

压缩:

1
zip test.zip test.doc //先压缩不然会报错  

分卷:

1
zip -s 15g test.zip --out ziptest  //每个子文件15g大小

合卷:

1
zip -F ziptest.zip --out file-large.zip 

解压:

1
unzip file-large.zip 

解压分块的zip文件

直接 unzip xxx.zip 报错:

1
2
3
4
5
6
7
8
9
10
11
file #1:  bad zipfile offset (local header sig):  4
file #2:  bad zipfile offset (local header sig):  207105
file #3:  bad zipfile offset (local header sig):  209345
..
..
file #302:  bad zipfile offset (lseek):  2924544
file #303:  bad zipfile offset (lseek):  2940928
..
..
..
inflating: en_US/1/2.zip
1
zip -F file.zip --out file-large.zip 
1
unzip file-large.zip 

ubuntu 修改 swap 文件大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 停用分区文件
sudo swapoff /swapfile

# 删除分区文件
sudo rm /swapfile

# /dev/zero 是选择的磁盘, 大小为1Gx8 == 8G,这里根据自己的需求去改
sudo dd if=/dev/zero of=/swapfile bs=1G count=8

# 修改权限,启用分区文件
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 查看swap空间大小
free -m

Bugs

apt-get常见错误——Unmet dependencies

安装错误:“E: Unmet dependencies.”

原因:非正常停止apt-get install *

错误提示:E: Unmet dependencies. Try ‘apt-get -f install’ with no packages (or specify a solution)

解决方法:sudo apt-get –fix-broken install

注意后面啥也没有,直接用这个命令修复apt-get。

Reference

  1. Linux下查看系统配置
  2. linux screen 命令小结
  3. iptables 开启指定端口
  4. UbuntuServer-18.04 U 盘安装教程
  5. 如何从命令行创建和调整ext4分区?
  6. Linux中查看进程状态信息
  7. ubuntu创建和删除用户
  8. 我的主板是华硕老主板,请问我u盘装系统怎么设置?
  9. Ubuntu环境下SSH服务安装、SSH远程登录以及SSH数据传输
  10. Ubuntu 18.04 安装 NVIDIA 显卡驱动
  11. vscode配置远程连接失败:过程试图写入的管道不存在(已解决)
  12. Ubuntu18.04 自动挂载硬盘
  13. dpkg安装以及卸载软件
  14. http error - listen tcp 127.0.0.1:1087: bind: address already in use - Mac
  15. Linux 让终端走代理的几种方法
  16. SFTP和FTP的区别
  17. Ubuntu下FTP工具推荐
  18. apt如何列出所有已经安装的软件包
  19. Ubuntu下查看内存使用情况
  20. Ubuntu 打开摄像头
  21. ubuntu18.04 修改屏幕分辨率
  22. tar.gz文件命名及压缩解压方法
  23. Ubuntu18显示实时网速
  24. 如何在Ubuntu 18.04 LTS中更改文本大小
  25. apt-get常见错误——Unmet dependencies
  26. Ubuntu系统批量杀死进程方法
  27. 【小记】将控制台输出保存至文件
  28. bad zip file offset when unzipping multi-part files
  29. 如何在Ubuntu上设置自定义DNS服务器
  30. Ubuntu修改swap文件大小
  31. zip分卷压缩与合并解压