大文件分割

备份的大文件,因为大文件不方便传输,切割成多个小文件。

实验

    对tar命令打包的1G~5G的压缩文件,进行分割(分卷)成3~5个小文件

分析

    1.得到10个500M的文本文件,打包成一个大的tar包文件
    2.对tar包文件进行分割成3个小文件

步骤

    1.如何得到一个大文件?
     编写脚本来完成产生一个100万行的文本文件,产生5个这样的文件
     使用重定向快速生成更加大的文件
     >>
    2.实验tar命令打包
    3.实验split进行分割


第一步:编写脚本big_file.sh

[root@jack 8-21]# vim big_file.sh
[root@jack 8-21]# cat big_file.sh 
#!/bin/bash

for i in {1..100000}
do
    echo "hello,world I am cali, we are learning linux tar split command how to write shell script" >>sc.txt
done

[root@jack 8-21]# bash big_file.sh 

[root@jack 8-21]# ls 
big_file.sh  sc.txt

[root@jack 8-21]# du -sh sc.txt
16M    sc.txt

第二步:使用重定向生成更加大的文件

[root@jack 8-21]# cat sc.txt >sc1.txt
[root@jack 8-21]# cat sc.txt >sc2.txt
[root@jack 8-21]# ls
big_file.sh  sc1.txt  sc2.txt  sc.txt

[root@jack 8-21]# cat sc.txt >>sc3.txt
[root@jack 8-21]# cat sc.txt >>sc3.txt
[root@jack 8-21]# cat sc.txt >>sc3.txt
[root@jack 8-21]# cat sc.txt >>sc3.txt
[root@jack 8-21]# cat sc.txt >>sc3.txt
[root@jack 8-21]# cat sc.txt >>sc3.txt
[root@jack 8-21]# ls
big_file.sh  sc1.txt  sc2.txt  sc3.txt  sc.txt

[root@jack 8-21]# ll -h
总用量 90M
-rw-r--r-- 1 root root  148 8月  21 10:19 big_file.sh
-rw-r--r-- 1 root root 8.5M 8月  21 10:21 sc1.txt
-rw-r--r-- 1 root root 8.5M 8月  21 10:21 sc2.txt
-rw-r--r-- 1 root root  51M 8月  21 10:22 sc3.txt
-rw-r--r-- 1 root root 8.5M 8月  21 10:20 sc.txt
[root@jack 8-21]# cat sc3.txt >>sc4.txt
[root@jack 8-21]# cat sc3.txt >>sc4.txt
[root@jack 8-21]# cat sc3.txt >>sc4.txt
[root@jack 8-21]# cat sc3.txt >>sc4.txt

[root@jack 8-21]# ll -h
总用量 333M
-rw-r--r-- 1 root root  148 8月  21 10:19 big_file.sh
-rw-r--r-- 1 root root 8.5M 8月  21 10:21 sc1.txt
-rw-r--r-- 1 root root 8.5M 8月  21 10:21 sc2.txt
-rw-r--r-- 1 root root  51M 8月  21 10:22 sc3.txt
-rw-r--r-- 1 root root 204M 8月  21 10:23 sc4.txt
-rw-r--r-- 1 root root 8.5M 8月  21 10:20 sc.txt

第三步:把文件移动到一个文件夹里

[root@jack 8-21]# mkdir sc
[root@jack 8-21]# ls
big_file.sh  sc  sc1.txt  sc2.txt  sc3.txt  sc4.txt  sc.txt

[root@jack 8-21]# mv sc* sc
mv: 无法将目录'sc' 移动至自身的子目录'sc/sc' 下
[root@jack 8-21]# ls
big_file.sh  sc

第四步:打包

[root@jack 8-21]# tar czf sc.tar.gz sc
[root@jack 8-21]# ls
big_file.sh  sc  sc.tar.gz

[root@jack 8-21]# du -sh sc.tar.gz
976K    sc.tar.gz

[root@jack 8-21]# du -sh sc
281M    sc

split

拆分的命令,将一个文件分割成数个。

选项

    1.根据大小(字节)

        -b 根据字节来截取,指定分割文件大小。
        -C 根据字节来截取,(尽量考虑整行的输出),指定每行最大的字节数。
        -a 指定生成的文件名后缀的长度,默认为2。

    2.根据行数

        -5
        -d 使用数字作为输出文件名的后缀。
        -l 按行分割,指定每个文件最大的行数。

案例

[root@ansible_nfs cjh3]# split -5 passwd

[root@ansible_nfs cjh3]# ls
passwd  xaa  xab  xac  xad  xae  xaf

[root@ansible_nfs cjh3]# cat xaa
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@ansible_nfs cjh3]# split -5 passwd sc_
[root@ansible_nfs cjh3]# ls
passwd  sc_aa  sc_ab  sc_ac  sc_ad  sc_ae  sc_af

[root@ansible_nfs cjh3]# split -l 10 passwd -d -a 3 sanchuang_

[root@ansible_nfs cjh3]# ls
passwd  sanchuang_000  sanchuang_001  sanchuang_002
[root@ansible_nfs cjh3]# cat sanchuang_001
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
chenyamin:x:1000:1000::/home/chenyamin:/bin/bash

[root@ansible_nfs cjh3]# split -b 10 passwd -d cs_
[root@ansible_nfs cjh3]# ls
cs_00  cs_06  cs_12  cs_18  cs_24  cs_30  cs_36  cs_42  cs_48  cs_54  cs_60  cs_66  cs_72  cs_78  cs_84  cs_9000  cs_9006  cs_9012  cs_9018  cs_9024  cs_9030  cs_9036  cs_9042  cs_9048  cs_9054  passwd
cs_01  cs_07  cs_13  cs_19  cs_25  cs_31  cs_37  cs_43  cs_49  cs_55  cs_61  cs_67  cs_73  cs_79  cs_85  cs_9001  cs_9007  cs_9013  cs_9019  cs_9025  cs_9031  cs_9037  cs_9043  cs_9049  cs_9055
cs_02  cs_08  cs_14  cs_20  cs_26  cs_32  cs_38  cs_44  cs_50  cs_56  cs_62  cs_68  cs_74  cs_80  cs_86  cs_9002  cs_9008  cs_9014  cs_9020  cs_9026  cs_9032  cs_9038  cs_9044  cs_9050  cs_9056
cs_03  cs_09  cs_15  cs_21  cs_27  cs_33  cs_39  cs_45  cs_51  cs_57  cs_63  cs_69  cs_75  cs_81  cs_87  cs_9003  cs_9009  cs_9015  cs_9021  cs_9027  cs_9033  cs_9039  cs_9045  cs_9051  cs_9057
cs_04  cs_10  cs_16  cs_22  cs_28  cs_34  cs_40  cs_46  cs_52  cs_58  cs_64  cs_70  cs_76  cs_82  cs_88  cs_9004  cs_9010  cs_9016  cs_9022  cs_9028  cs_9034  cs_9040  cs_9046  cs_9052  cs_9058
cs_05  cs_11  cs_17  cs_23  cs_29  cs_35  cs_41  cs_47  cs_53  cs_59  cs_65  cs_71  cs_77  cs_83  cs_89  cs_9005  cs_9011  cs_9017  cs_9023  cs_9029  cs_9035  cs_9041  cs_9047  cs_9053  cs_9059

# 合并
[root@ansible_nfs cjh3]# cat cs_* >cs_passwd
[root@ansible_nfs cjh3]# diff cs_passwd passwd
[root@ansible_nfs cjh3]# echo $?
0
[root@ansible_nfs cjh3]# md5sum passwd
e72d4e878d989d854a73c45267b39bcf  passwd
[root@ansible_nfs cjh3]# md5sum cs_passwd 
e72d4e878d989d854a73c45267b39bcf  cs_passwd

使用

# 将sc.tar.gz文件按照100k为一个文件进行分割
[root@jack 8-21]# split -b 100k -d  -a 1 sc.tar.gz sc.tar.gz.

[root@jack 8-21]# ls
big_file.sh  sc.tar.gz.0  sc.tar.gz.3  sc.tar.gz.6  sc.tar.gz.9
sc            sc.tar.gz.1  sc.tar.gz.4  sc.tar.gz.7
sc.tar.gz     sc.tar.gz.2  sc.tar.gz.5  sc.tar.gz.8

[root@jack changsha]# tar tf sc.tar.gz.1
tar: 它似乎不像是一个 tar 归档文件
tar: 跳转到下一个头
tar: 由于前次错误,将以上次的错误状态退出

# 分割后的10个文件
[root@jack 8-21]# mkdir changsha
[root@jack 8-21]# cd changsha
[root@jack changsha]# ls
sc.tar.gz.0  sc.tar.gz.2  sc.tar.gz.4  sc.tar.gz.6  sc.tar.gz.8
sc.tar.gz.1  sc.tar.gz.3  sc.tar.gz.5  sc.tar.gz.7  sc.tar.gz.9

# 还原
[root@jack changsha]# cat sc.tar.gz.* |tar xz

# 使用cat的命令拼接多个分割好的文件通过管道给tar命令解压
[root@jack changsha]# ls
sc           sc.tar.gz.1  sc.tar.gz.3  sc.tar.gz.5  sc.tar.gz.7  sc.tar.gz.9
sc.tar.gz.0  sc.tar.gz.2  sc.tar.gz.4  sc.tar.gz.6  sc.tar.gz.8

[root@jack changsha]# cd sc
[root@jack sc]# ls
sc1.txt  sc2.txt  sc3.txt  sc4.txt  sc.txt

[root@jack changsha]# cat sc.tar.gz.* >>sc.tar.gz
[root@jack changsha]# ls
sc         sc.tar.gz.0  sc.tar.gz.2  sc.tar.gz.4  sc.tar.gz.6  sc.tar.gz.8
sc.tar.gz  sc.tar.gz.1  sc.tar.gz.3  sc.tar.gz.5  sc.tar.gz.7  sc.tar.gz.9

[root@jack changsha]# du -sh sc.tar.gz
976K    sc.tar.gz

[root@jack changsha]# tar tf sc.tar.gz
sc/
sc/sc1.txt
sc/sc2.txt
sc/sc3.txt
sc/sc4.txt
sc/sc.txt

tar

tar 是类 Unix 系统中广泛使用的命令,用于归档多个文件或目录到单个归档文件中,并且归档文件可以进一步使用 gzip 或者 bzip2 等技术进行压缩。

--exclude 排除

将/boot目录下的除grub2目录以外的所有文件都备份到/bak目录下叫no-grub2.tar.gz。

[root@jack zhang]# tar -zcf /zhang/boot.tar.gz /boot
[root@jack zhang]# tar --exclude=/boot/grub2 -zcf /zhang/no-grub2-boot.tar.gz /boot
[root@jack zhang]# tar --exclude=/boot/{grub2,efi} -zcf /zhang/no-efi-boot.tar.gz /boot
[root@jack zhang]# ls
boot.tar.gz  no-efi-boot.tar.gz  no-grub2-boot.tar.gz

不需要引号引起来

[root@jack zhang]# tar --exclude=/boot/{grub2,loader}  -czf /bak/no-grub2.tar.gz  /boot
tar --exclude=/mydata/log -czf /wag/no_log_mydata.tar.gz /mydata/
GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:4 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐