档案的压缩、打包与备份
压缩档案可以减少磁盘的占用,同时也可以减小网络传输中的频宽,加快传输效率。Linux中,虽然副档名没有什么特殊的意义,但为了分辨不同压缩工具压缩的档案,使用了不同的命名方式:
- *.Z:compress 程式压缩的档案
- *.zip:zip程式压缩的档案
- *.gz:gzip 程式压缩的档案
- *.bz2:bzip2 程式压缩的档案
- *.xz:xz 程式压缩的档案
- *.tar:tar 程式打包的资料,并没有压缩过
- *.tar.gz:tar 程式打包的档案,其中并且经过 gzip 的压缩
- *.tar.bz2:tar 程式打包的档案,其中并且经过 bzip2 的压缩
- *.tar.xz:tar 程式打包的档案,其中并且经过 xz 的压缩
compress目前已退出了主流,被gzip所替代,zip是为了支援windows中常见的zip,bzip2和xz是比gzip压缩比更好的压缩指令,但相应的也会消耗更多的时间,因此对于gzip、bizp2、xz之间的选择更多的时gzip。gizp、bizp2、xz只能压缩与解压缩单个档案,于是便出现了打包工具tar,tar可以将多个档案或目录打包成一个档案,然后使用压缩工具进行压缩。
档案的压缩
gzip,gunzip,zcat/zmore/zless/zgrep
gzip可以解开compress、zip与gzip等压缩的档案,在使用gizp压缩时,预设的状态下原本的档案被压缩成.gz的档名,原始档案就不存在了。
语法:
gzip [ -acdfhlLnNrtvV123456789 ] [-S suffix] [ name... ]
gunzip [ -acdfhlLnNrtvV ] [-S suffix] [name...]
zcat [-fhlV] [name...]
OPTION:
- -a,–ascii:ascii文本模式
- -c,–stdout,–to-stdout:将压缩的资料输出到萤幕上,可透过资料流重导向来处理
- -d,–decompress,–uncompress:解压缩
- -f,–force:强制解压或压缩覆盖存在的文件
- -h,–help:获取help
- -l,–list:列出压缩或解压文件的信息,包括method,crc,date,time,size of compressed,size of uncompressed,ratio,uncompressed_name
- -L,–license:显示gzip许可证并离开
- -r,–recursive:如果name一个目录,gzip将进入这个目录并且压缩或解压缩这个目录下的所有档案
- -t ,–test:可以用来检验一个压缩档的一致性~看看档案有无错误
- -v,–verbose:可以显示出原档案/压缩档案的压缩比等资讯;
- -#,–fast,–best:# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是-6
gunzip是解压指令,等同于gzip -d
,cat、more、less可以用来读取纯文字档,而zcat、zmore、zless可以读取纯文字档压缩后的压缩档,zgrep可以搜索压缩档中的关键字。
bizp2,bzcat/bzmore/bzless/bzgrep
若说gzip 是为了取代compress 并提供更好的压缩比而成立的,那么bzip2 则是为了取代gzip 并提供更佳的压缩比而来的。
语法:
bzip2 [-cdfkqstvzVL123456789] [filenames ...]
bunzip2 [-fkvsVL] [filenames ...]
bzcat [-s] [filenames ...]
bzip2recover filename
OPTION:
- -c ,–stdout:将压缩或解压缩的过程产生的资料输出到荧幕上
- -d,–decompress :解压缩的参数
- -z ,–compress:压缩的参数(预设值,可以不加)
- -f,–force:强制解压或压缩覆盖存在的文件
- -t ,–test:可以用来检验一个压缩档的一致性~看看档案有无错误
- -k ,–keep:保留原始档案,而不会删除原始的档案
- -v ,–verbose:可以显示出原档案/压缩档案的压缩比等资讯
- -# :与gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快
与gzip的用法和参数基本一样,包括bzcat、bzmore、bzless、bzgrep,值得注意的时bzip2有一个-k参数可以保留原始档案。
xz,xzcat/xzmore/xzless/xzgrep
xz是比gzip、bzip2压缩比更高的软件,但xz最大的问题是相比以上两种指令花费时间太久,与gzip和bzip2的用法基本一样。
语法:
xz [option...] [file...]
OPTION:
- -c ,–stdout:将压缩或解压缩的过程产生的资料输出到荧幕上
- -f,–force:强制解压或压缩覆盖存在的文件
- -d,–decompress :解压缩的参数
- -z ,–compress:压缩的参数(预设值,可以不加)
- -t ,–test:可以用来检验一个压缩档的一致性~看看档案有无错误
- -l,–list:列出压缩文件的信息,包括method,crc,date,time,size of compressed,size of uncompressed,ratio,uncompressed_name
- -k ,–keep:保留原始档案,而不会删除原始的档案
- -S .suf,–suffix=.suf:使用.suf歹意默认的.xz或.lzma
- -v ,–verbose:可以显示出原档案/压缩档案的压缩比等资讯
- -# :与gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快
打包与备份
tar
gzip、bzip2、xz虽然也能够对目录来进行压缩,不过对目录的压缩指的是对目录内的所有档案分别进行压缩,Linux中可使用tar指令将多个档案或目录打包成一个大档案后再压缩。
语法:
tar [-z|j|J][cv] [-f FILENAME] TARGET...
:打包与压缩
tar [-z|j|J][tv] [-f FILENAME]
:查看已存在压缩包中的档名
tar [-z|j|J][xv] [-f FILENAME] [-C DIR]
:解压到指定目录
OPTION:
-
–delete:从档案中删除
-
-r,–append:添加文件到档案的结尾
-
-u,–update:仅在档案中追加更新的内容
-
-c,–create:建立打包档案,可搭配 -v 来查看过程中被打包的档名(filename)
-
-t,–list :查看打包档案的內容含有哪些档名
-
-x,–extract,–get :解打包或解压缩的功能,可以搭配 -C 在特定目录解开,特別留意的是, -c, -t, -x 不可同时出现在一串指令列中
-
-z,–gzip:透过 gzip 的支援进行压缩/解压缩:此时档名最好为 *.tar.gz
-
-j,–bzip2:透过 bzip2 的支援进行压缩/解压缩:此时档名最好为 *.tar.bz2
-
-J,–xz:透过 xz 的支援进行压缩/解压缩:此时档名最好为 *.tar.xz特別留意, -z, -j, -J 不可以同时出现在一串指令列中
-
-v,–verbose:在压缩/解压缩的过程中,将正在处理的档名显示出来
-
-f filename:被压缩的档案或目录的压缩档案名
-
-C,–directory=DIR:解压缩到特定的目录
-
-p:保留备份资料的原本权限与属性
-
-P:保留绝对路径,亦即允许备份资料中含有根目录存在之意
-
–exclude=FILE:在压缩过程中,不要将FILE打包
-
–newer-mtime=DATE:比DATE时间更新的档案
常用压缩:tar -jcv -f filename.tar.bz2 TARGET
常用查询:tar -jtv -f filename.tar.bz2
常用解压缩:tar -jxv -f filename.tar.bz2 -C DIR
filename.tar.bz2是我们取的档名,tar并不会主动的产生建立的档名
基本名称:tarfile,tarball
tar打包出来的档案有没有进行压缩所得到的档案的称呼不同,如果仅打包如tar -cv -f etc.tar /etc
,我们称这个档案为tarfile,如果进行了压缩的支援如tar -zcv -f etc.tar.gz /etc
,我们称这个档案为tarball。
使用-z/-j/-J的参数备份/etc目录
从上面可以看到,虽然gzip的速度相当快,但压缩率最糟糕,而xz虽然压缩率最佳,但花费的时间相当长。-p选项可以保存原本档案的权限与属性;上述的示例显示"Removing leading ‘/’ from member names",表示移除压缩包中档名的根目录,下面的示例中-P选项可以保留压缩包中档案名的绝对路径。
打包某目录但不包含该目录下某些档案
使用–exclude选项来排除不需要包含的档案,可以使用多个–exclude选项,下例是备份/root、/etc目录并排除/root/etc*、/root/shadowsocksR.sh档案。
仅备份比某个时刻还要新的档案
使用–newer-mtime选项可以备份不同时间点之后更新的档案,这样之前已经备份了的档案就无需备份了,可以有效的降低备份的容量。
查询tar档案的资料内容(可查看档名)
-v选项可以详细的列出档案权限/属性,如果去掉-v只会列出档名。
解打包解压缩,可解压缩到指定目录(-C)
默认解打包解压缩到当前工作目录,当然也可以指定解压的目录,使用-C选项。如以下示例解压到/tmp目录:
解开压缩包中单一档案
刚刚上头我们解压缩都是将整个打包档案的内容全部解开!想像一个情况,如果我只想要解开打包档案内的其中一个档案而已, 那该如何做呢?很简单的,你只要使用-jtv 找到你要的档名,然后将该档名解开即可。我们用底下的例子来说明一下:
vim程式编辑器
vi与vim
在Linux 的世界中,绝大部分的设定档都是以ASCII 的纯文字形态存在,因此利用简单的文字编辑软件就能够修改设定了,Linux在文字介面下的文书编辑器有:emacs、pico、nano、joe、vi、vim等。
vi的优点:
- 所有的Unix Like 系统都会内建vi 文本编辑器,其他的文本编辑器则不一定会存在
- 很多个别软件的编辑界面都会主动呼叫vi
- vim 具有程式编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程式设计
- 因为程式简单,编辑速度相当快速。
vim是vi的进阶版本,vim可以用颜色或底线等方式来显示一些特殊的资讯,vim可以依据档案的副档名或档案内的开头资讯来判断该档案的内容而主动呼叫该程式的语法判断式,再以颜色来显示程式码与一般资讯。
vi使用
vi共分为三种模式,分别是『一般指令模式』、『编辑模式』与『指令列命令模式』。这三种模式的作用分别是:
-
一般指令模式(command mode):以vi 打开一个档案就直接进入一般指令模式了(这是预设的模式,也简称为一般模式)。在这个模式中, 你可以使用『上下左右』按键来移动游标,你可以使用『删除字元』或『删除整列』来处理档案内容, 也可以使用『复制、贴上』来处理你的文件资料。
-
编辑模式(insert mode):在一般指令模式中可以进行删除、复制、贴上等等的动作,但是却无法编辑文件内容的!要等到你按下『i, I, o, O, a, A, r, R』等任何一个字母之后才会进入编辑模式。注意了!通常在Linux中,按下这些按键时,在画面的左下方会出现『INSERT或REPLACE』的字样,此时才可以进行编辑。而如果要回到一般指令模式时,则必须要按下『Esc』这个按键即可退出编辑模式。
-
指令列命令模式(command-line mode):在一般模式当中,输入『 : / ?』三个中的任何一个按钮,就可以将游标移动到最底下那一列。在这个模式当中,可以提供你『搜寻资料』的动作,而读取、存档、大量取代字元、离开vi 、显示行号等等的动作则是在此模式中达成的!
三种模式的切换:
一般指令模式按键功能
移动游标的常用功能键 | 说明 |
---|---|
h 或向左方向键(←) | 游标向左移动一个字元 |
j 或向下方向键(↓) | 游标向下移动一个字元 |
k 或向上方向键(↑) | 游标向上移动一个字元 |
l 或向右方向键(→) | 游标向右移动一个字元 |
n[h(←)j(↓)k(↑)l(→)] | n是数字,表示移动的n个字元 |
[Ctrl] + [f] | 萤幕『向下』移动一页,相当于[Page Down]按键( 常用 ) |
[Ctrl] + [b] | 萤幕『向上』移动一页,相当于[Page Up]按键( 常用 ) |
[Ctrl] + [d] | 萤幕『向下』移动半页 |
[Ctrl] + [u] | 萤幕『向上』移动半页 |
+ | 游标移动到非空白字元的下一行 |
- | 游标移动到非空白字元的上一行 |
n<space> | 那个n 表示『数字』,例如20 。按下数字后再按空白键,游标会向右移动这一行的n 个字元。例如20<space> 则游标会向后面移动20 个字元距离。 |
0 或功能键[Home] | 这是数字『 0 』:移动到这一行的最前面字元处( 常用 ) |
$ 或功能键[End] | 移动到这一行的最后面字元处( 常用 ) |
H | (head)游标移动到这个萤幕的最上方那一行的第一个字元 |
M | (middle)游标移动到这个萤幕的中央那一行的第一个字元 |
L | (lower)游标移动到这个萤幕的最下方那一行的第一个字元 |
G | 移动到这个档案的最后一行( 常用 ) |
nG | n 为数字。移动到这个档案的第n 行。例如20G 则会移动到这个档案的第20 行(可配合:set nu) |
gg | 移动到这个档案的第一行,相当于1G( 常用 ) |
n<Enter> | n为数字。游标向下移动n行( 常用 ) |
搜索与取代常用功能键 | 说明 |
/word | 向游标之下寻找一个名称为word的字串( 常用 ) |
?word | 向游标之上寻找一个字串名称为word 的字串 |
n | 英文按键n,重复前一个搜索动作 |
N | 英文按键N,反向重复前一个搜索动作 |
:n1,n2s/word1/word2/g | n1与n2为数字。在第n1与n2行之间寻找word1这个字串,并将该字串取代为word2( 常用 ) |
:1,$s/word1/word2/g | 从第一行到最后一行寻找word1字串,并将该字串取代为word2( 常用 ) |
:1,$s/word1/word2/gc | 从第一行到最后一行寻找word1字串,并将该字串取代为word2 !且在取代前显示提示字元给使用者确认(confirm)是否需要取代( 常用 ) |
删除、复制与粘贴常用功能键 | 说明 |
x, X | 在一行字当中,x为向后删除一个字元(相当于[del]按键), X为向前删除一个字元(相当于[backspace]亦即是倒退键)( 常用 ) |
nx, nX | n 为数字,连续向后/向前删除n 个字元 |
dd | 删除游标所在的那一整行( 常用 ) |
ndd | n为数字。删除游标所在的向下n行( 常用 ) |
d1G | 删除游标所在到第一行的所有资料 |
dG | 删除游标所在到最后一行的所有资料 |
d$ | 删除游标所在处,到该行的最后一个字元 |
d0 | 删除游标所在处,到该行的第一个字元 |
yy | 复制游标所在的那一行( 常用 ) |
nyy | n为数字。复制游标所在的向下n行( 常用 ) |
y1G | 复制游标所在行到第一行的所有资料 |
yG | 复制游标所在行到最后一行的所有资料 |
y0 | 复制游标所在的那个字元到该行行首的所有资料 |
y$ | 复制游标所在的那个字元到该行行尾的所有资料 |
p, P | p为将已复制的资料在游标下一行贴上,P则为贴在游标上一行( 常用 ) |
J | 将游标所在行与下一行的资料结合成同一行 |
c | 重复删除多个资料,例如向下删除10行,[ 10cj ] |
u | 撤销( 常用 ) |
[Ctrl]+r | 重做上一个动作( 常用 ) |
. | 重做上一个动作( 常用 ) |
一般指令模式与编辑模式的切换
一般指令模式与编辑模式切换方法 | 说明 |
---|---|
i,I | 进入插入模式(Insert mode):i为『从游标处插入』, I为『从游标所在行第一个非空白字元处插入』。( 常用 ) |
a,A | 进入插入模式(Insert mode):a为『从游标所在下一个字元处插入』, A为『从游标所在行最后一个非空白字元处插入』。( 常用 ) |
o,O | 进入插入模式(Insert mode):o为『从游标所在行下方插入新的一行』; O为『从游标所在行下方插入新的一行』( 常用 ) |
r,R | 进入取代模式(Replace mode):r为『取代游标所在处字元一次』;R『一直取代游标所在处字元,直到ESC为止』( 常用 ) |
[Esc] | 退出编辑模式,回到一般指令模式中( 常用 ) |
一般指令模式与指令列模式的切换
指令列模式的存储、离开等指令 | 说明 |
---|---|
:w | 将编辑的资料写入硬碟档案中( 常用 ) |
:w! | 若档案属性为『唯读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关 |
:q | 离开vi ( 常用 ) |
:q! | 若曾修改过档案,又不想储存,使用! 为强制离开不储存档案 |
:wq[!] | 储存后离开,若为:wq!则为强制储存后离开( 常用 ) |
ZZ | 若档案没有更动,则不储存离开,若档案已经被更动过,则储存后离开 |
:w [filename] | 将编辑的资料储存成另一个档案 |
:r [filename] | 在编辑的资料中,读入另一个档案的资料 |
:n1,n2 w [filename] | 将n1 到n2 行的内容储存成filename 这个档案 |
:! command | 暂时离开vi到指令列模式下执行command的显示结果 |
:set nu | 显示行号,设定之后,会在每一行的字首显示该行的行号 |
:set nonu | 与set nu相反,取消行号 |
vim的额外功能
使用alias指令显示如下,则表示vi已经被vim所取代,如果仍想使用vi,可以使用/bin/vi
补全指令名。
[yutao@study ~]$ alias
alias vi='vim'
...
区块选择(Visual Block)
区块选择功能键 | 说明 |
---|---|
v | 字元选择,会将游标经过的地方反白选择 |
V | 行选择,会将游标经过的行反白选择 |
[Ctrl]+v | 区块选择,可以用长方形的方式选择资料 |
y | 将反白的地方复制起来 |
d | 将反白的地方删除掉 |
p | 将刚刚复制的区块,在游标所在处贴上 |
多档案编辑
vim可以开启多个档案来同时编辑,使用vim filename...
指令,这样就可以在多个档案之间实现复制、粘贴等操作。
多档案编辑功能键 | 说明 |
---|---|
:n | 编辑下一个档案 |
:N | 编辑上一个档案 |
:files | 列出目前这个vim 的开启的所有档案 |
多视窗功能
在实际应用中可能会有以下二种情况:
- 当我有一个档案非常的大,我查阅到后面的资料时,想要『对照』前面的资料, 可能需要使用[ctrl]+f 与[ctrl]+b (或pageup, pagedown 功能键) 来跑前跑后查阅
- 我有两个需要对照着看的档案,不想使用前一小节提到的多档案编辑功能
为了解决上述二个问题,vim提供了多视窗功能,可以开启多个视窗打开同一个档案或不同档案。在指令列模式输入:sp [filename]
,如果想要在新视窗启动另一个档案,就加入档名,否则仅输入:sp
,出现的则是同一个档案在两个视窗间。
多视窗的功能键 | 说明 |
---|---|
:sp [filename] | 开启一个新视窗,如果有加filename, 表示在新视窗开启一个新档案,否则表示两个视窗为同一个档案内容(同步显示) |
[ctrl]+w+j,[ctrl]+w+↓ | 游标移动到下方的视窗(先先按下[ctrl] 不放, 再按下w 后放开所有的按键,然后再按下j或↓键),下面功能键同样方式操作 |
[ctrl]+w+ k,[ctrl]+w+↑ | 游标移动到上方的视窗 |
[ctrl]+w+q | 等同于:q,结束当前游标所在视窗 |
vim的补全功能
类似于windows下的notepad++等这类程式编辑器,可以根据语法补全程式语言的语法以及特定的语法关键字。
|组合按钮|补全方式|
|[ctrl]+x -> [ctrl]+n|透过目前正在编辑的这个『档案的内容文字』作为关键字,予以补齐|
|[ctrl]+x -> [ctrl]+f|以当前目录内的『档名』作为关键字,予以补齐|
|[ctrl]+x -> [ctrl]+o|以副档名作为语法补充,以vim 内建的关键字,予以补齐|
vim环境设定与记录:/.vimrc,/.viminfo
当我们使用vim软件搜索一个档案的某个字符串时,这个字符串会被反白,而下次再次编辑这个档案时这个字符串反白情况还存在,且游标也存在上次离开时的位置,这是因为vim会自动的将我们曾经做过的行为记录在档案~/.viminfo
中。对于每个distributions对vim的预设环境都不太相同,比如,某些Linux版本在搜索关键字时并不会高亮反白显示,有些版本会主动帮你进行缩排(换行缩进与上行第一个字元对齐)的行为,这些预设的环境参数可以在一般指令模式输入:set all
查阅或查看etc/vimrc
档案。
vim的环境设定参数 | 说明 |
---|---|
:set nu,:set nonu | 设定与取消行号 |
:set hlsearch,:set nohlsearch | hlsearch 就是high light search(高亮度搜寻)。这个就是设定是否将搜寻的字串反白的设定值。预设值是hlsearch |
:set autoindent,:set noautoindent | 是否自动缩排?autoindent 就是自动缩排 |
:set backup | 是否自动储存备份档?一般是nobackup 的,如果设定backup 的话,那么当你更动任何一个档案时,则原始档案会被另存成一个档名为filename~ 的档案。举例来说,我们编辑hosts ,设定:set backup ,那么当更动hosts 时,在同目录下,就会产生hosts~ 档名的档案,记录原始的hosts 档案内容 |
:set ruler | 右下角的一些状态列说明 |
:set showmode | 是否要显示–INSERT-- 之类的字眼在左下角的状态列 |
:set backspace=(012) | 如果我们按下i 进入编辑模式后,可以利用倒退键(backspace) 来删除任意字元的。但是,某些distribution 则不许如此。此时,我们就可以透过backspace 来设定,当backspace 为2 时,就是可以删除任意值;0 或1 时,仅可删除刚刚输入的字元,而无法删除原本就已经存在的文字 |
:set all | 显示目前所有的环境参数设定值 |
:set | 显示与系统预设值不同的设定参数, 一般来说就是你有自行变动过的设定参数 |
:syntax on,:syntax off | 是否依据程式相关语法显示不同颜色?举例来说,在编辑一个纯文字档时,如果开头是以# 开始,那么该列就会变成蓝色。如果你懂得写程式,那么这个:syntax on 还会主动的帮你除错呢!但是,如果你仅是编写纯文字档案,要避免颜色对你的萤幕产生的干扰,则可以取消这个设定 |
:set bg=dark,:set bg=light | 可用以显示不同的颜色色调,预设是『 light 』。如果你常常发现注解的字体深蓝色实在很不容易看, 那么这里可以设定为dark |
:set fileencoding[=charset] | 查看或设置编码 |
如果想自定义vim的环境设定参数,可以更改/etc/vimrc
这个档案,但是一般不建议这样做,可以创建~/.vimrc
这个档案并将希望设定的参数写入。
[root@study ~]# vim ~/.vimrc
"这个档案的双引号(")是注解
set hlsearch "高亮度反白
set backspace=2 "可随时用倒退键删除
set autoindent "自动缩排
set ruler "可显示最后一列的状态
set showmode "左下角那一列的状态
set nu "可以在每一列的最前面显示行号啦!
set bg=dark "显示不同的底色色调
syntax on "进行语法检验,颜色显示
DOS与Linux的断行字元
DOS与Linux的断行字元是不同的,DOS(Windows系统)下建立的档案的断行字元为 M$(CRLF),而Linux下建立的档案的断行字元为$(LF),『Enter』在Linux下为LF符号,在DOS下为CRLF符号,如果将DOS下创建的档案复制到Linux下就会多出一个M(CR)符号,档案若是一个shell script的程式档案可能就会造成程式无法执行。这样大家应该都能想到将档案中每行的CR符号删除,但是真的一个一个删除岂不累死,Linux下可以使用指令来实现格式的转换,使用dos2unix和unix2dos指令(需要安装软件)实现dos与unix格式间的互转。
[root@study ~]# dos2unix [-kn] file [newfile]
[root@study ~]# unix2dos [-kn] file [newfile]
选项与参数:
-k :保留该档案原本的mtime 时间格式
-n :保留原本的旧档,将转换后的内容输出到新档案
语系编码转换
使用iconv
指令可以实现档案编码的转换
[root@study ~]# iconv [options] [-f from-encoding] [-t to-encoding] [-o outputfile] [inputfile]
选项与参数:
--list :列出iconv 支持的语系资料
-f from-encoding:原本的编码格式
-t to-encoding:要转换的编码格式
-o outputfile:如果要保留原本的档案,那么使用-o 新档名,可以建立新编码档案
[root@study ~]# file -i temp
temp: gb2312 text;charset=gb2312
[root@study ~]# iconv -f gb2312 -t utf8 temp -o temp.utf8
[root@study ~]# file -i temp*
temp: utf8 text;charset=utf8
temp.utf8: utf8 text;charset=utf8
如果使用file
指令查看编码有问题,可以用vim打开档案输入:set fileencoding
指令查看编码。