改章节是一篇关于文件目录的帖子
弁言:你可能经已听说过在Linux中一切皆是文件,所以一定要打好础基,把文件和目录的管理如查找、列出、挪动、制复、包打等学踏实。本文针对LPI 101试考,当然读者也可以为了兴致来学习。
要摘:本文分析几本的文件和目录管理令命,详细有
- 举列目录中文件
- 制复、挪动或者除删文件和目录
- 迭代作操多个文件和目录
- 应用通配符
- 应用find令命,根据文件类型、巨细或者时光来查找定位文件
- 应用gzip和bizp2来压缩和解压文件
- 应用tar,cpio,dd来包打文件
举列目录中的文件
举列目录包括的项
[root@localhost lpi103-2]# pwd /root/lpi103-2 [root@localhost lpi103-2]# ls msg sedtab text1 text2 text3 text5 text6 xaa xab yaa yab [root@localhost lpi103-2]# ls $PWD msg sedtab text1 text2 text3 text5 text6 xaa xab yaa yab [root@localhost lpi103-2]# ls /root/lpi103-2/ msg sedtab text1 text2 text3 text5 text6 xaa xab yaa yab
可以看出,ls的参数可所以绝对路径,也可所以相对路径。
举列细详信息
[root@localhost lpi103-2]# ls -al total 92 drwxr-xr-x 2 root root 4096 May 7 17:29 . dr-xr-x---. 10 root root 4096 May 7 15:47 .. -rw-r--r-- 1 root root 43851 May 7 15:38 msg -rw-r--r-- 1 root root 8 May 7 17:14 sedtab -rw-r--r-- 1 root root 24 May 7 14:29 text1 -rw-r--r-- 1 root root 25 May 7 14:48 text2 -rw-r--r-- 1 root root 63 May 7 16:07 text3 -rw-r--r-- 1 root root 24 May 7 16:41 text5 -rw-r--r-- 1 root root 98 May 7 17:29 text6 -rw-r--r-- 1 root root 15 May 7 15:15 xaa -rw-r--r-- 1 root root 9 May 7 15:15 xab -rw-r--r-- 1 root root 17 May 7 15:16 yaa -rw-r--r-- 1 root root 8 May 7 15:16 yab
上图第一行示显了列出的全部文件所占用的block数量。接下来的行报告了个每文件的况情。
- 第一列报告了文件的类型以及权限。第一个字符示表文件的类型,其中d示表目录,-示表一般文件,-l示表符号链接,还有很多其他特别的文件类型。接下来的9个字符被分红三组,每组三个字符。三个分组别分示表文件属主、同组用户、其他用户对文件的读、写、行执权限。
- 第二列示表文件的硬链接数。我们说过,inode包括了文件的元信息。目录中的每个项都包括了一个指向inode的指针,所以每个文件至少有一个硬链接。对于目录说来,其自身又包括了示表自己的.,再加上父目录中对它的硬链接,所以至少有2个硬链接,又因为个每子目录中还有一个..来链接父目录,所以每增长一个子目录,父目录的硬链接数也就加1。如上图中/root共有10个硬链接。
- 第三列第四列别分示表文件属主和属主的主分组,在一些如RedHat的系统中,个每用户认默有一个立独的分组,但是其他系统中可能不是这样。
- 第五列是文件的长度,以字节为位单。
- 倒数第二列,示表文件最后修改时光。
- 最后一列是文件名。
[root@localhost lpi103-2]# ls -i 1839215 msg 1839209 text1 1839189 text3 1839219 text6 1839212 xab 1839214 yab 1839218 sedtab 1839210 text2 1839216 text5 1839211 xaa 1839213 yaa
同时举列多个目录或文件
ls 可以同时受接多个文件或目录作为参数。对于目录名,ls认默会读取目录的容内然后列出个每项的元信息,而不是列出目录本身的元信息。可以应用-d选项来变改种这认默方法。如下:
[root@localhost lpi103-2]# ls -ld ../lpi103-2 sedtab xaa drwxr-xr-x 2 root root 4096 May 7 17:29 ../lpi103-2 -rw-r--r-- 1 root root 8 May 7 17:14 sedtab -rw-r--r-- 1 root root 15 May 7 15:15 xaa
序排输出结果
认默况情下,ls按照文件名序排输出。ls供提了很多选项来制控输出的序排,例如-t 是按照修改时光(最新修改在前)序排,-lS 则按照巨细序排, -r则倒转序排后先。例如 -lrt会按照修改时光序排,并且最新修改的在最后输出。更多地选项参考man手册页。
制复、挪动、除删文件
我们经已学会了一些创立文件的方法,那么如何制复、重命名、挪动、或者除删文件呢?这要用到三个很短的令命:
- cp 于用制复一个或多个文件或者目录。必须供提源和的目参数,源或的目参数可以包括路径。如果目标是一个存在的目录,那么全部的源都将制复到这个目录下。如果目标是一个不存在的目录, 那么源也必须是目录,然后一个源目录的拷贝就会生产,称名为目标称名。(译者注:在CentOS6中验实,结果不是这样)如果目标是文件,那么源也必须是文件,然后源文件的一份拷贝就会生产,并且以目标名为新称名,如果目标文件存在,则覆盖之。与DOS和Windows不同,这里的目标参数必须供提,不存在认默的目标参数。
- mv 于用重命名或者挪动一个或多个文件及目录。其则规与cp相似。因为文件名字只是其地点目录的一个项的性属,所以更名不并会影响inode编号。但是跨文件系统挪动时,inode将会变改,因为这要靠制复然后除删来原的文件来现实。
- rm 于用除删一个或者多个文件。后面我们会探讨除删目录的问题。
[root@localhost lpi103-2]# cp text1 text1.bkp [root@localhost lpi103-2]# mkdir backup [root@localhost lpi103-2]# cp text1 backup/text1.bkp.2 [root@localhost lpi103-2]# ls -i text1 text1.bkp backup/ 1839209 text1 1839220 text1.bkp backup/: 1839222 text1.bkp.2 [root@localhost lpi103-2]# mv text1.bkp backup [root@localhost lpi103-2]# mv backup/text1.bkp backup/text1.bkp.1 [root@localhost lpi103-2]# ls -i text1 text1.bkp backup ls: cannot access text1.bkp: No such file or directory 1839209 text1 backup: 1839220 text1.bkp.1 1839222 text1.bkp.2
- 制复text1,失掉副本text1.bkp
- 应用mkdir创立了一个于用份备的子目录
- 制复了text1的另外一个副本到backup目录中,然后示显了这三份一样的文件其对应的inode编号各不同相
- 然后挪动text1.bkp到了backup目录中,并且新重命名为text1.bkp.1
- 然后核实了inode编号为1839220的text1.bkp文件经已不再存在lpi103-2中,inode编号变不,称名变改了的text1.bkp.1存到了backup目录中。
- -f 或者 --force 致使cp会试尝覆盖掉目标文件,即使目标文件不可写。
- -i 或者 --interactive 在覆盖目标之前,提示用户认确。
- -b或者 --backup 会在覆盖目标之前,把目标先份备。
[root@localhost lpi103-2]# cp text2 backup [root@localhost lpi103-2]# cp --backup=t text2 backup cp: overwrite `backup/text2'? y [root@localhost lpi103-2]# ls backup/ text1.bkp.1 text1.bkp.2 text2 text2.~1~
注意rm令命也支撑-i和-f选项。当你应用rm除删了一个文件,那么文件系统将不能再问访它。有些系统认默为root用户设置了 alias rm = 'rm -i' ,来避免误除删作操。
创立和除删目录
mkdir
[root@localhost lpi103-2]# mkdir dir1 dir2 [root@localhost lpi103-2]# ls backup dir1 dir2 msg sedtab text1 text2 text3 text5 text6 xaa xab yaa yab
注意mkdir的功成行执不并会有任何的输出。当然你可以通过echo $?来认确出退码确实是0。
[root@localhost lpi103-2]# mkdir d1/d2/d3 mkdir: cannot create directory `d1/d2/d3': No such file or directory [root@localhost lpi103-2]# echo $? 1 [root@localhost lpi103-2]# mkdir -p d1/d2/d3 [root@localhost lpi103-2]# echo $? 0
rmdir
[root@localhost lpi103-2]# cp text1 d1/d2/ [root@localhost lpi103-2]# rmdir -p d1/d2/d3 dir1 dir2 rmdir: failed to remove directory `d1/d2': Directory not empty [root@localhost lpi103-2]# ls ./d1/d2 text1 [root@localhost lpi103-2]# rm d1/d2/text1 rm: remove regular file `d1/d2/text1'? y [root@localhost lpi103-2]# rmdir -p d1/d2 [root@localhost lpi103-2]#
理处多个文件和目录
递归作操
- 递归举列
[root@localhost lpi103-2]# ls -iR .: 1839221 backup 1839218 sedtab 1839210 text2 1839216 text5 1839211 xaa 1839213 yaa 1839215 msg 1839209 text1 1839189 text3 1839219 text6 1839212 xab 1839214 yab ./backup: 1839220 text1.bkp.1 1839222 text1.bkp.2 1839224 text2 1839223 text2.~1~
- 递归制复
[root@localhost lpi103-2]# cp -pR . copy1 cp: cannot copy a directory, `.', into itself, `copy1' [root@localhost lpi103-2]# ls -R .: backup copy1 msg sedtab text1 text2 text3 text5 text6 xaa xab yaa yab ./backup: text1.bkp.1 text1.bkp.2 text2 text2.~1~ ./copy1: backup msg sedtab text1 text2 text3 text5 text6 xaa xab yaa yab ./copy1/backup: text1.bkp.1 text1.bkp.2 text2 text2.~1~
- 递归除删
[root@localhost lpi103-2]# rm -rf copy1 [root@localhost lpi103-2]# ls -R .: backup msg sedtab text1 text2 text3 text5 text6 xaa xab yaa yab ./backup: text1.bkp.1 text1.bkp.2 text2 text2.~1~ [root@localhost lpi103-2]#
如果有些文件你没有写权限,你可能须要应用-f来强制除删。
通配符和文件名替换
- ? 配匹任何单个字符
- * 配匹任何字符串,括包空字符串
- [ 引入一个字符类,一个字符类是一个非空字符串,以']'尾结。配匹[]中的任何一个字符都可以。这里有一些特别况情:
[root@localhost lpi103-2]# echo odd1>'text[*?!1]' [root@localhost lpi103-2]# echo odd2>'text[2*?!]' [root@localhost lpi103-2]# ls backup msg sedtab text1 text[*?!1] text2 text[2*?!] text3 text5 text6 xaa xab yaa yab [root@localhost lpi103-2]# ls text[2-4] text2 text3 [root@localhost lpi103-2]# ls text[!2-4] text1 text5 text6 [root@localhost lpi103-2]# ls text*[2-4]* text2 text[2*?!] text3 [root@localhost lpi103-2]# ls text*[!2-4]* text1 text[*?!1] text[2*?!] text5 text6 [root@localhost lpi103-2]# ls text*[!2-4] text1 text[*?!1] text[2*?!] text5 text6 [root@localhost lpi103-2]# echo text*>text10 [root@localhost lpi103-2]# ls *\!* text[*?!1] text[2*?!] [root@localhost lpi103-2]# ls tex?[[]* text[*?!1] text[2*?!] [root@localhost lpi103-2]# rm tex?[[]* rm: remove regular file `text[*?!1]'? y rm: remove regular file `text[2*?!]'? y [root@localhost lpi103-2]# ls *b* sedtab xab yab backup: text1.bkp.1 text1.bkp.2 text2 text2.~1~ [root@localhost lpi103-2]# ls backup/*2 backup/text1.bkp.2 backup/text2 [root@localhost lpi103-2]# ls -d .*
注意:
[root@localhost lpi103-2]# echo text* text1 text10 text2 text3 text5 text6 [root@localhost lpi103-2]# echo "text*" text* [root@localhost lpi103-2]# echo text[[\!?]z?? text[[!?]z??
触摸文件
touch
[root@localhost lpi103-2]# echo xxx>f1; ls -l f1; sleep 60; touch f1; ls -l f1 -rw-r--r-- 1 root root 4 May 8 16:50 f1 -rw-r--r-- 1 root root 4 May 8 16:51 f1
如果为touch 指定的文件名对应的文件不存在,那么touch将会创立这个文件,除非应用-c或者--nocreate选项。如下:
[root@localhost lpi103-2]# touch f2; touch -c f3; ls -l f* -rw-r--r-- 1 root root 4 May 8 16:51 f1 -rw-r--r-- 1 root root 0 May 8 16:53 f2
touch也可应把文件的修改时光设置为特定的时光。这通过 -d 或者 -t 来指定。-d 是个非常灵活的选项,能受接各种格式的参数,-t 则须要至少 MMDDhhmm的时光和可选的年和秒。如下:
[root@localhost lpi103-2]# touch -t 198111261212.59 f3 [root@localhost lpi103-2]# touch -d 11am f4 [root@localhost lpi103-2]# touch -d "last fortnight" f5 [root@localhost lpi103-2]# touch -d "yesterday 6am" f6 [root@localhost lpi103-2]# touch -d "2 days ago 12:00" f7 [root@localhost lpi103-2]# touch -d "tomorrow 02:00" f8 [root@localhost lpi103-2]# touch -d "5 Nov" f9 [root@localhost lpi103-2]# ls -lrt f* -rw-r--r-- 1 root root 0 Nov 26 1981 f3 -rw-r--r-- 1 root root 0 Apr 24 16:57 f5 -rw-r--r-- 1 root root 0 May 6 12:00 f7 -rw-r--r-- 1 root root 0 May 7 06:00 f6 -rw-r--r-- 1 root root 0 May 8 11:00 f4 -rw-r--r-- 1 root root 4 May 8 16:51 f1 -rw-r--r-- 1 root root 0 May 8 16:53 f2 -rw-r--r-- 1 root root 0 May 9 2013 f8 -rw-r--r-- 1 root root 0 Nov 5 2013 f9
如果你不确定一个日期表达式到底示表的是什么时光,你可以应用date令命来查看。date 也受接-d选项,解释方法与touch同相。
[root@localhost lpi103-2]# date Wed May 8 17:02:57 CST 2013 [root@localhost lpi103-2]# date -r f1 Wed May 8 16:51:50 CST 2013 [root@localhost lpi103-2]# touch -r f1 f1a [root@localhost lpi103-2]# ls -l f1* -rw-r--r-- 1 root root 4 May 8 16:51 f1 -rw-r--r-- 1 root root 0 May 8 16:51 f1a
Linux系统会同时记录文件的问访时光和修改时光。通常应用atime和mtime这两个术语示表。当文件刚被创立时,这两个时光戳被设置为同一个值,当文件被修改时,这两个值同时被更新。当一个文件仅仅被问访时,atime被更新,mtime则变不。在最后一个touch的例子中,我们将会看看atime。
[root@localhost lpi103-2]# cat f1 xxx [root@localhost lpi103-2]# ls -lu f1* -rw-r--r-- 1 root root 4 May 9 09:34 f1 -rw-r--r-- 1 root root 0 May 8 16:51 f1a [root@localhost lpi103-2]# touch -a -r f1a f1 [root@localhost lpi103-2]# ls -lu f1* -rw-r--r-- 1 root root 4 May 8 16:51 f1 -rw-r--r-- 1 root root 0 May 8 16:51 f1a
首先应用cat来问访f1文件,这样f1的atime就被更新了,然后应用touch的-a选项来设置f1的atime与f1a的atime一致,最后查看修改的结果。
查找文件
find
[root@localhost lpi103-2]# find . -name "*[1k]*" ./f1 ./text10 ./backup ./backup/text2.~1~ ./backup/text1.bkp.1 ./backup/text1.bkp.2 ./f1a ./text1 [root@localhost lpi103-2]# find . -ipath "*ACK*1" ./backup/text1.bkp.1 [root@localhost lpi103-2]# find . -ipath "*ACK*/*1" ./backup/text1.bkp.1
说明:
- 这里应用的模式与shell的通配符模式完全同相;
- -path于用指定于用配匹的不是文件名本身,而是整个路径名;
- -i则是忽略巨细写
- 如果想搜索以.扫尾的文件或目录,如.bashrc或者以后目录.,那么模式的扫尾必须是一个.,否则这些文件会被忽略。
[root@localhost lpi103-2]# find . -type d . ./backup [root@localhost lpi103-2]# find . -type d -name "*" . ./backup
注意,-type d不带任何参数时,会示显以.扫尾的文件,与通配符"*"一样。
[root@localhost lpi103-2]# find . -size 0 ./f8 ./f6 ./f9 ./f2 ./f5 ./f1a ./f4 ./f7 ./f3 [root@localhost lpi103-2]# find . -size +23c -size -26c -print ./backup/text2.~1~ ./backup/text1.bkp.1 ./backup/text1.bkp.2 ./backup/text2 ./text2 ./text1 ./text5
在第二个令命中,我们应用了-print选项,这是对搜索的结果行进的作操。在bash中,如果没有指定作操,则print就是认默的作操。在其他的系统或shell中,作操是必须的,否则不会有任何输出。
root@localhost lpi103-2]# find . -size -26c -size +23c -ls 1839223 4 -rw-r--r-- 1 root root 25 May 8 14:58 ./backup/text2.~1~ 1839220 4 -rw-r--r-- 1 root root 24 May 8 14:40 ./backup/text1.bkp.1 1839222 4 -rw-r--r-- 1 root root 24 May 8 14:41 ./backup/text1.bkp.2 1839224 4 -rw-r--r-- 1 root root 25 May 8 14:58 ./backup/text2 1839210 4 -rw-r--r-- 1 root root 25 May 7 14:48 ./text2 1839209 4 -rw-r--r-- 1 root root 24 May 7 14:29 ./text1 1839216 4 -rw-r--r-- 1 root root 24 May 7 16:41 ./text5 [root@localhost lpi103-2]# find . -size -26c -size +23c -exec ls -l '{}' \; -rw-r--r-- 1 root root 25 May 8 14:58 ./backup/text2.~1~ -rw-r--r-- 1 root root 24 May 8 14:40 ./backup/text1.bkp.1 -rw-r--r-- 1 root root 24 May 8 14:41 ./backup/text1.bkp.2 -rw-r--r-- 1 root root 25 May 8 14:58 ./backup/text2 -rw-r--r-- 1 root root 25 May 7 14:48 ./text2 -rw-r--r-- 1 root root 24 May 7 14:29 ./text1 -rw-r--r-- 1 root root 24 May 7 16:41 ./text5
-exec选项的能力超出你的想象,例如:
[root@localhost lpi103-2]# find . -mtime -2 -type f -exec ls -l '{}' \; -rw-r--r-- 1 root root 0 May 9 02:00 ./f8 -rw-r--r-- 1 root root 8 May 7 15:16 ./yab -rw-r--r-- 1 root root 0 Nov 5 2013 ./f9 -rw-r--r-- 1 root root 9 May 7 15:15 ./xab -rw-r--r-- 1 root root 43851 May 7 15:38 ./msg -rw-r--r-- 1 root root 0 May 8 16:53 ./f2 -rw-r--r-- 1 root root 4 May 8 16:51 ./f1 -rw-r--r-- 1 root root 17 May 7 15:16 ./yaa -rw-r--r-- 1 root root 52 May 8 16:10 ./text10 -rw-r--r-- 1 root root 25 May 8 14:58 ./backup/text2.~1~ -rw-r--r-- 1 root root 24 May 8 14:40 ./backup/text1.bkp.1 -rw-r--r-- 1 root root 24 May 8 14:41 ./backup/text1.bkp.2 -rw-r--r-- 1 root root 25 May 8 14:58 ./backup/text2 -rw-r--r-- 1 root root 98 May 7 17:29 ./text6 -rw-r--r-- 1 root root 0 May 8 16:51 ./f1a -rw-r--r-- 1 root root 25 May 7 14:48 ./text2 -rw-r--r-- 1 root root 0 May 8 11:00 ./f4 -rw-r--r-- 1 root root 24 May 7 14:29 ./text1 -rw-r--r-- 1 root root 24 May 7 16:41 ./text5 -rw-r--r-- 1 root root 8 May 7 17:14 ./sedtab -rw-r--r-- 1 root root 63 May 7 16:07 ./text3 -rw-r--r-- 1 root root 15 May 7 15:15 ./xaa [root@localhost lpi103-2]# find . -daystart -mtime -2 -type f -exec ls -l '{}' \; -rw-r--r-- 1 root root 0 May 9 02:00 ./f8 -rw-r--r-- 1 root root 0 Nov 5 2013 ./f9 -rw-r--r-- 1 root root 0 May 8 16:53 ./f2 -rw-r--r-- 1 root root 4 May 8 16:51 ./f1 -rw-r--r-- 1 root root 52 May 8 16:10 ./text10 -rw-r--r-- 1 root root 25 May 8 14:58 ./backup/text2.~1~ -rw-r--r-- 1 root root 24 May 8 14:40 ./backup/text1.bkp.1 -rw-r--r-- 1 root root 24 May 8 14:41 ./backup/text1.bkp.2 -rw-r--r-- 1 root root 25 May 8 14:58 ./backup/text2 -rw-r--r-- 1 root root 0 May 8 16:51 ./f1a -rw-r--r-- 1 root root 0 May 8 11:00 ./f4 [root@localhost lpi103-2]# find . -mmin -600 -mmin +60 -type f -exec ls -l '{}' \; -rw-r--r-- 1 root root 0 May 9 02:00 ./f8
- 当应用-mtime -2时,find令命会查找最近2天(48小时内)修改的文件。一天就是于对相以后时光的24小时。如果想根据问访时光而不是修改时光,那么应用-atime代替-mtime。
- 当应用-daystart时,则示表是按照日历的天来算的,而不是相对以后时光的24小时。
- 最后例子中,我们查找的时在过去60分钟-600分钟之内修改过的文件。
识别文件
[root@localhost lpi103-2]# file backup/ text1 f2 ../music/wee-willie-winkie.mp3 /bin/echo backup/: directory text1: ASCII text f2: empty ../music/wee-willie-winkie.mp3: Audio file with ID3 version 2.3.0, contains: /bin/echo: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
file令命应用三种类型的测试来为文件分类。首先是应用stat令命来认确文件否是为空或者是目录;然后根据文件中的“魔数”来识别文件类型;最后的语言测试用来确定文本文件否是是一个xml,C或者C++源程序、troff文件、或者其他程序设计语言的源文件。这三个步骤依次行执,一旦有一个步骤识别功成了,就会停止并报告结果,除非指定了-k或者--keep-going选项。
[root@localhost lpi103-2]# file -i backup/ text1 f2 ../music/wee-willie-winkie.mp3 /bin/echo backup/: application/x-directory; charset=binary text1: text/plain; charset=us-ascii f2: application/x-empty; charset=binary ../music/wee-willie-winkie.mp3: application/octet-stream; charset=binary /bin/echo: application/x-executable; charset=binary
file令命也会管理“魔数”,一样须要读者自行参考man手册页。
压缩文件
应用gzip和gunzip
[root@localhost lpi103-2]# cp -p /etc/services . [root@localhost lpi103-2]# ls -l serv* -rw-r--r-- 1 root root 641020 Oct 15 2012 services [root@localhost lpi103-2]# gzip services [root@localhost lpi103-2]# ls -l serv* -rw-r--r-- 1 root root 127223 Oct 15 2012 services.gz
应用gzip的-d选项来解压文件,更经常应用的是gunzip令命。如下:
[root@localhost lpi103-2]# gzip -d services.gz [root@localhost lpi103-2]# ls -l serv* -rw-r--r-- 1 root root 641020 Oct 15 2012 services
注意,解压后的文件与原始的文件有同相的文件名和时光戳。
应用bzip2和bunzip2
[root@localhost lpi103-2]# ls -l serv* -rw-r--r-- 1 root root 641020 Oct 15 2012 services [root@localhost lpi103-2]# bzip2 services [root@localhost lpi103-2]# ls -l serv* -rw-r--r-- 1 root root 115774 Oct 15 2012 services.bz2 [root@localhost lpi103-2]# bunzip2 services.bz2 [root@localhost lpi103-2]# ls -l serv* -rw-r--r-- 1 root root 641020 Oct 15 2012 services
gzip和bzip2的差异
[root@localhost lpi103-2]# ls -l serv* -rw-r--r-- 1 root root 641020 Oct 15 2012 services [root@localhost lpi103-2]# gzip -N services [root@localhost lpi103-2]# touch services.gz [root@localhost lpi103-2]# mv services.gz services-x.gz [root@localhost lpi103-2]# ls -l serv* -rw-r--r-- 1 root root 127223 May 9 11:15 services-x.gz [root@localhost lpi103-2]# gzip -l services-x.gz compressed uncompressed ratio uncompressed_name 127223 641020 80.2% services-x [root@localhost lpi103-2]# gzip -lN services-x.gz compressed uncompressed ratio uncompressed_name 127223 641020 80.2% services [root@localhost lpi103-2]# gunzip -N services-x.gz [root@localhost lpi103-2]# ls -l serv* -rw-r--r-- 1 root root 641020 Oct 15 2012 services [root@localhost lpi103-2]# bzip2 services [root@localhost lpi103-2]# mv services.bz2 services-x.bz2 [root@localhost lpi103-2]# touch services-x.bz2 [root@localhost lpi103-2]# ls -l serv* -rw-r--r-- 1 root root 115774 May 9 11:17 services-x.bz2 [root@localhost lpi103-2]# bunzip2 services-x.bz2 [root@localhost lpi103-2]# ls -l serv* -rw-r--r-- 1 root root 641020 May 9 11:17 services-x [root@localhost lpi103-2]# rm services-x # Don't need this any more
gzip和bzip2都能出标准输入中受接输入,都支撑-c选项来直接向stdout输出。
- bzcat 压缩文件到标准输出,与bzip2 -dc同相;
- bzip2recover 试尝从损坏的bzip2文件中恢复数据。
其他压缩工具
包打多个文件
- 微分或累积份备。份备自上次完全份备以来发生变化的部分。恢复的时候,至少须要最后一个完全份备和最新的累积份备。
- 增量份备。份备自上次增量份备以来发生的变化部分。恢复的时候,须要最后一个完全份备,还有全部的增量份备(按顺序)。
- 完全份备。通常是整个文件系统或一组文件或目录的完整份备。种这方法须要的时光最长,所以它通常配合上面两种方法的一种来工作。
应用tar
[root@localhost lpi103-2]# tar -cvf ../lpitar1.tar . ./ ./f8 ./f6 ./yab ./f9 ./xab ./msg ./f2 ./f5 ./f1 ./yaa ./text10 ./backup/ ./backup/text2.~1~ ./backup/text1.bkp.1 ./backup/text1.bkp.2 ./backup/text2 ./text6 ./f1a ./text2 ./f4 ./text1 ./text5 ./sedtab ./f7 ./text3 ./xaa ./f3
通常我们想通过压缩归档文件来节省存储空间和传输时光。GUN版本的tar令命允许你通过-z来应用gzip来压缩,通过-b应用bzip2来压缩。上面例子展示了应用-z来压缩归档文件,以及压缩与不压缩版本的巨细区别。
[root@localhost lpi103-2]# tar -zcvf ../lpitar3.tar ~/lpi103-2/ tar: Removing leading `/' from member names /root/lpi103-2/ /root/lpi103-2/f8 /root/lpi103-2/f6 /root/lpi103-2/yab /root/lpi103-2/f9 /root/lpi103-2/xab /root/lpi103-2/msg /root/lpi103-2/f2 /root/lpi103-2/f5 /root/lpi103-2/f1 /root/lpi103-2/yaa /root/lpi103-2/text10 /root/lpi103-2/backup/ /root/lpi103-2/backup/text2.~1~ /root/lpi103-2/backup/text1.bkp.1 /root/lpi103-2/backup/text1.bkp.2 /root/lpi103-2/backup/text2 /root/lpi103-2/text6 /root/lpi103-2/f1a /root/lpi103-2/text2 /root/lpi103-2/f4 /root/lpi103-2/text1 /root/lpi103-2/text5 /root/lpi103-2/sedtab /root/lpi103-2/f7 /root/lpi103-2/text3 /root/lpi103-2/xaa /root/lpi103-2/f3 [root@localhost lpi103-2]# ls -l ../lpitar* -rw-r--r-- 1 root root 71680 May 9 13:26 ../lpitar1.tar -rw-r--r-- 1 root root 13595 May 9 13:30 ../lpitar2.tar
本例还示显了tar的另一个重要特征。我们应用了目录的绝对路径,tar的输出的第一行告诉我们除删了扫尾的/。这就允许文件被恢复到其他的路径下,这对于恢复系统文件非常重要。入股哦你确实想要存储绝对路径,应用-p选项。在创立归档文件时一定要避免混淆绝对路径和相对路径,因为从归档文件恢复的时候都是采用相对路径。
[root@localhost lpi103-2]# touch f1 [root@localhost lpi103-2]# tar --diff --file ../lpitar1.tar . ./f1: Mod time differs [root@localhost lpi103-2]# tar -df ../lpitar2.tar -C ./ ./f1: Mod time differs [root@localhost lpi103-2]# tar -xvf ../lpitar1.tar ./f1 ./f1 [root@localhost lpi103-2]# tar --compare -f ../lpitar2.tar --directory ./
指定的要恢复的文件名必须配匹归档文件中德文件名。在本例中如果不是./f1而是f1的话,将不会工作。也可以应用通配符,但是要当心恢复的文件列表否是和你想要的完全一样。当不能确定归档文件里有什么文件时,你也可以应用-t或者--list选项来列出归档文件的容内。如下例:
[root@localhost lpi103-2]# tar -tf ../lpitar1.tar "*f1*" ./f1 ./f1a
你可以应用find令命来选择要归档的文件,然后通过管道把结果传送给tar。我们将在讲解cpio令命的时候探讨种这技术,一样的方法也适于用tar。
应用cpio
[root@localhost lpi103-2]# find . -depth -print0 | cpio --null -o > ../lpicpio.1 89 blocks [root@localhost lpi103-2]# find ~/lpi103-2/ -depth -print0 | cpio --null -o > ../lpicpio.2 90 blocks
如果你想要查看归档文件的细详信息,应用cpio的-v选项。
[root@localhost lpi103-2]# cpio -i --list "*backup*"< ../lpicpio.1 backup/text2.~1~ backup/text1.bkp.1 backup/text1.bkp.2 backup/text2 backup 89 blocks [root@localhost lpi103-2]# cpio -i --list absolute-filenames "*text1*" < ../lpicpio.2 /root/lpi103-2/text10 /root/lpi103-2/backup/text1.bkp.1 /root/lpi103-2/backup/text1.bkp.2 /root/lpi103-2/text1 90 blocks
上面例子中,展示了应用cpio来恢复"text1"到一个临时子目录中,与tar不同,你须要显式地指定一个-d或者--make-direcotories选项来创立这个子目录。另外,cpio不会应用归档文件中的文件覆盖文件系统中更新的同名文件,除非你应用了-u或者--unconditional选项。
[root@localhost lpi103-2]# mkdir temp [root@localhost lpi103-2]# cd temp/ [root@localhost temp]# cpio -idv "*f1*" "*.bkp.1" <http://www.cnblogs.com/lpicpio.1 f1 backup/text1.bkp.1 f1a 89 blocks [root@localhost temp]# cpio -idv "*.bkp.1" < http://www.cnblogs.com/lpicpio.1 cpio: backup/text1.bkp.1 not created: newer or same age version exists backup/text1.bkp.1 89 blocks [root@localhost temp]# cpio -id --no-absolute-filenames "*text1*" < http://www.cnblogs.com/lpicpio.2 cpio: Removing leading `/' from member names 90 blocks [root@localhost temp]# cd .. [root@localhost lpi103-2]# rm -rf temp
dd 令命
[root@localhost lpi103-2]# cat text6 1 apple 2 pear 3 banana 9 plum 3 banana 10 apple 1 apple 2 pear 3 banana 9 plum 3 banana 10 apple [root@localhost lpi103-2]# dd if=text6 conv=ucase ibs=20 obs=30 1 APPLE 2 PEAR 3 BANANA 9 PLUM 3 BANANA 10 APPLE 1 APPLE 2 PEAR 3 BANANA 9 PLUM 3 BANANA 10 APPLE 4+1 records in 3+1 records out 98 bytes (98 B) copied, 3.9944e-05 s, 2.5 MB/s
每个文件都可以示原始设备。这通常会是一个磁带设备,也可能是一个磁盘分区如/dev/hda1或者/devs/da2,可以份备到磁带中或者一个文件中。理想的况情下,份备时设备上的文件系统应该被载卸或者至少是只读挂载的,这样才能确保份备的程过中数据不会发生变改。
[root@localhost ~]# dd if=/dev/sda6 of=backup-1 31248384+0 records in 31248384+0 records out 15999172608 bytes (16 GB) copied, 855.25 s, 18.7 MB/s
[root@localhost ~]# ll total 15624432 -rw-------. 1 root root 1033 Mar 27 11:12 anaconda-ks.cfg -rw-r--r-- 1 root root 15999172608 May 9 15:17 backup-1
[root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 56G 18G 35G 34% / tmpfs 947M 0 947M 0% /dev/shm /dev/sda5 74G 15G 56G 21% /data /dev/sda6 15G 870M 14G 7% /work
注意dd制复了16GB的数据,并且输出的文件确实是这么大,尽管/dev/sda6这个分区,实际应用了7%的容量。除非采用硬件压缩的方法份备到磁带上,一般都须要压缩文件。上面例子示显了现实方法。
[root@localhost ~]# dd if=/dev/sda6 | gzip >backup-2 31248384+0 records in 31248384+0 records out 15999172608 bytes (16 GB) copied, 1549.11 s, 10.3 MB/s
[root@localhost ~]# ll back* -rw-r--r-- 1 root root 15999172608 May 9 15:17 backup-1 -rw-r--r-- 1 root root 13400290321 May 9 15:55 backup-2
译者注:本验实译者没做,没找到合适的挪动硬盘。
文章结束给大家分享下程序员的一些笑话语录:
小沈阳版程序员~~~ \n程序员其实可痛苦的了......需求一做一改,一个月就过去了;嚎~ \n需求再一改一调,一季度就过去了;嚎~ \n程序员最痛苦的事儿是啥,知道不?就是,程序没做完,需求又改了; \n程序员最最痛苦的事儿是啥,知道不? 就是,系统好不容易做完了,方案全改了; \n程序员最最最痛苦的事儿是啥,知道不? 就是,系统做完了,狗日的客户跑了; \n程序员最最最最最痛苦的事儿是啥,知道不? 就是,狗日的客户又回来了,程序给删没了!