• 文件目录IBM的LPI复习资料之LPI101Topic103 :GNU和Unix命令(3)文件和目录管理


    改章节是一篇关于文件目录的帖子

        弁言:你可能经已听说过在Linux中一切皆是文件,所以一定要打好础基,把文件和目录的管理如查找、列出、挪动、制复、包打等学踏实。本文针对LPI 101试考,当然读者也可以为了兴致来学习。

        要摘:本文分析几本的文件和目录管理令命,详细有

        

    • 举列目录中文件
    • 制复、挪动或者除删文件和目录
    • 迭代作操多个文件和目录
    • 应用通配符
    • 应用find令命,根据文件类型、巨细或者时光来查找定位文件
    • 应用gzip和bizp2来压缩和解压文件
    • 应用tar,cpio,dd来包打文件

        

    本文帮助你为LPI-1的103.2温习,本部分权重是4。

        


        

    举列目录中的文件

        

    全部Linux和Unix中的文件都是从一个单根树状文件系统中取得,这个文件系统的为一个的根就是/。可以应用mount挂载更多的文件到这个树上,也可以应用unmount载卸树上的已有文件。

        


        

    举列目录包括的项

        

    本文中,我们将应用前一篇文章中创立的文件来做验实。

        


        

    文件和目录的路径可所以绝对路径(以/扫尾),也可所以相对路径(于对相以后工作目录)。绝对路径以/扫尾,后面是目录的称名,目录之间应用/隔分。

        


        

    给定一个文件或目录的相对路径,则以后工作目录的绝对路径/相对路径 就是文件或目录的绝对路径了。例如以后工作目录的绝对路径是 /home/ian,已知目录的相对路径是lpi103-2,则其绝对路径就是 /home/ian/lpi103-2。

        


        

    应用pwd令命可以打印出以后的工作目录。有时候环境变量PWD也代表以后工作目录。下图展示了应用pwd令命,以及三种不同的方法来应用ls来举列目录中的文件。

        


    [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的参数可所以绝对路径,也可所以相对路径。

        

    举列细详信息

        

    在一个存储设备中,一个文件或者目录是被寄存到被称为block的多个存储单元中的。一个文件的元信息则寄存到inode中,它记录了文件的属主、修改时光、巨细、否是是目录、读写权限等。inode号也被叫做文件序列号,在一个特定的文件系统中它是一唯的。我们可以应用-l选项(或者--format=long)来示显这些元信息。

        


        

    认默况情下,ls不会示显以文件名.扫尾的文件。除了根目录,其他个每目录中至少有两个这样的文件:一个是目录本身(.),另一个是父目录(..)。根目录没有父目录。

        


        

    下图展示了应用-l 和 -a选项来示显元信息以及以.扫尾的特别文件。

        


    [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的系统中,个每用户认默有一个立独的分组,但是其他系统中可能不是这样。
    • 第五列是文件的长度,以字节为位单。
    • 倒数第二列,示表文件最后修改时光。
    • 最后一列是文件名。

        

    ls -i 会示显文件的inode号。

        


    [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

    (译者注:硬链接就是目录中寄存的inode号,一个inode号在多少个目录中现出,就是有多少个硬链接。没有被硬链接了的inode,也就无法问访了,对应的文件也就相当于被除删了,上一个不严格的图帮助解理一下)
    文件和目录

    同时举列多个目录或文件

    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 于用除删一个或者多个文件。后面我们会探讨除删目录的问题。

        


        

    上面的验实应用了cp和mv来份备我们的文件,也应用了ls -i来示显文件的节点信息。

        


    [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

    1. 制复text1,失掉副本text1.bkp
    2. 应用mkdir创立了一个于用份备的子目录
    3. 制复了text1的另外一个副本到backup目录中,然后示显了这三份一样的文件其对应的inode编号各不同相
    4. 然后挪动text1.bkp到了backup目录中,并且新重命名为text1.bkp.1
    5. 然后核实了inode编号为1839220的text1.bkp文件经已不再存在lpi103-2中,inode编号变不,称名变改了的text1.bkp.1存到了backup目录中。
    畸形况情下,如果目标文件存在,那么cp将会覆盖之。而mv却不会。 可以通过选项来制控cp 和 mv的覆盖为行。

        

    • -f 或者 --force 致使cp会试尝覆盖掉目标文件,即使目标文件不可写。
    • -i 或者 --interactive 在覆盖目标之前,提示用户认确。
    • -b或者 --backup 会在覆盖目标之前,把目标先份备。
    还是那句话,细详的选项参数请参考man手册页。

        


    [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' ,来避免误除删作操。

        

    结束本节之前,我们调强一下:cp会为目标文件创立一个新的时光戳。目标文件的属主和组也被设置为运行cp令命的用户以及组。可以应用-p选项来坚持源的某些元信息。但是只有root用户才能保存文件的属主信息(译者注:这也是为了全安,否则就能够造伪文件作者了)。

        


        

    创立和除删目录

        

    我们经已应用mkdir创立目录了。本节我们深刻学习mkdir和rmdir。

        


        

    mkdir

        

    假设我们在lpi103-2目录下,想要创立两个子目录dir1和dir2。和其他令命一样,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。

        

    如果我们想要创立一个层级嵌套的子目录,例如 d1/d2/d3,这将会失败,因为d1和d2目录不并存在。运幸的是mkdir有一个-p选项来动自创立所需的父目录,如下:

        


    [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

    与创立目录相反,rmdir用来除删目录。一样也存在一个-p选项来除删父目录。rmdir只能用来除删空目录。

        


        

    为了演示目录除删,我们制复text1文件到d1/d2目录下。然后我们应用rmdir来除删后面应用mkdir创立的全部目录。我们看到d1和d2没有被除删,因为d2不是空目录。其他的目录被除删了。当我们从d2中除删了text1后,就能够应用rmdir -p 来除删d1和d2。

        


    [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]# 

    理处多个文件和目录

    到目前为止,我们作操的都是一个文件或者是一组单个文件。本文接下来将会探讨理处多个文件的作操。括包递归作操目录树,存保或者恢复多个文件及目录。

        


        

    递归作操

        

    • 递归举列
    
    
    ls 应用-R选项来列出一个目录及其子目录。递归选项只作于用目录名。例如他不会找到全部的叫做text1的文件(译者注:没弄懂什么意思)。如下所示:

        

     
    [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~

    • 递归除删
    后面我们说过rmdir只能除删空目录。我们可以应用rm -r来递归除删文件和目录。上面展示了除删刚才创立的copy1目录及其全部子目录和文件。

    [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来强制除删。

        

    通配符和文件名替换

        


        

    有时候,我们须要作操多个文件系统对象,但不是一个目录树下。例如,我们要找到全部的文本文件的修改时光,但不括包分片文件。这对于我们的lpi103-2是非常易容的,但是对于大的文件系统说来就难题多了。

        


        

    要决解这个问题,就要应用bash建内的通配符支撑。种这支撑也叫做“globbing",因为最初的现实就是一个叫做glob的程序。让我们通过通配符指定多个文件吧!

        


        

    任何括包'?',‘*‘,’[‘的字符串都叫做通配模式。替换程过就是shell或者其他的程序扩展这下跌通配模式为配匹这些模式的路径名列表。配匹程过是这样的:

        


        

    • ? 配匹任何单个字符
    • * 配匹任何字符串,括包空字符串
    • [ 引入一个字符类,一个字符类是一个非空字符串,以']'尾结。配匹[]中的任何一个字符都可以。这里有一些特别况情:
    (1)*和?配匹他们自身。如果文件名应用了这些字符,注意引号和转义。

        

    (2)因为字符串必须非空,并且以]尾结,你必须首先放置]。

        

    (3)-可以用来示表围范,如[0-9a-fA-F]示表任何大写或者小写的十六进制数字。如果想应用-自身,则把他放到最开始或者最后。

        

    (4)!放到第一位时,示表围范的取反,不在第一位则示表其自身。注意shell本身也应用!示表历史令命,所以应用的时候要注意转义。

        


        

    注意:通配符模式和正则表达式模式有些共同点,但是不完全同相,一定要当心!!!(译者注:其中一个区别是,通配符模式动自含有开始和尾结标记)

        


        

    文件名替换针对每个路径名立独行进。你不能配匹/也不能在围范中包括。

        


    [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 .*

    注意:
    1 取反和*在一起的时候对致使一些奇怪的现象。模式*[!2-4]配匹一个文件名没有2,3,4跟随的最长部分。

        

    2 与后面ls的例子一样,如果模式扩展结果是一个目录名,并且没有应用-d选项,那么这个目录的容内将会被举列。

        

    3 如果文件名以.开始,那么必须显式的配匹。

        


        

    记住令命行上的任何通配符都会被shell扩展,这将会致使不希望的结果。更糟糕的是,如果你指定的模式不配匹任务文件系统对象,POSIX标准要求原始的模式字符串作为参数传递给令命。有些早期的现实版本会传递一个空列表给令命,所以你可能一些老脚本可能会致使非预期的结果。如下:

        


    [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??
    

    更深刻的学习路径名替换,应用man 7 glob。须要应用分节号,因为在section 3中也有 glob库的容内。解理各种shell的通配符工作方法的最好方法就是动手验实。在cp,mv,特别是rm令命上应用通配符之前,要先应用ls来测试通配符的工作况情。

        


        

    触摸文件

        

    现在我们来学习touch令命,它被用来更新文件的获取和修改时光,也用来创立空文件。在后面我们将学习如何利用这些信息查找文件和目录。学习应用指定时光戳的各种方法。

        


        

    touch

        

    不带任何选项的touch令命,受接一个或多个文件名作为参数,然后更新这些文件的的修改时光。上面例子中,我们应用echo创立了一个小文件f1,然后应用ls -l示显文件的修改时光。然后人应用sleep令命等待60秒,再运行ls -l,注意文件的时光戳变改了1分钟。

        


    [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同相。

        

    你还可以应用-r(或者--reference)选项来引用其他文件的修改时光。如下:

        


    [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一致,最后查看修改的结果。

        

    关于其他的日期时光的格式,请参考touch 和 date的man手册页。

        


        

    查找文件

        

    后面我们分析了文件和目录作操的两大重量级工具:递归像一个大锤子来选择全部文件和目录,通配符这个大锤子则带来更加灵活的选择。现在我们来学习find这个令命,它更像是一个外科手术刀。find被用与在一个或多个目录中根据像文件名、时光戳、巨细等来查找文件。

        


        

    find

        

    find令命在指定的目录中根据全部或部分文件名或者其他的性属如巨细、类型、属主、创立时光、问访时光等来搜索文件。最基本的搜索时根据文件名或者部分文件名。上面例子中,我们首先在lpi103-2文件夹中搜索文件名中含有1或者k的文及,然后行执一些路径搜索,后面会有解释。

        


    [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

    说明:

        

    1. 这里应用的模式与shell的通配符模式完全同相;
    2. -path于用指定于用配匹的不是文件名本身,而是整个路径名;
    3. -i则是忽略巨细写
    4. 如果想搜索以.扫尾的文件或目录,如.bashrc或者以后目录.,那么模式的扫尾必须是一个.,否则这些文件会被忽略。
    在上面的第一个例子中,我们既找到了文件,也找到了目录。应用-type用来限制查找的类型。 f示表常规文件,d示表目录文件,l示表符号链接,还有其他的类型请参考find的man手册页。上面的例子中,应用了-type d 来搜索目录。

        


    [root@localhost lpi103-2]# find . -type d
    .
    ./backup
    [root@localhost lpi103-2]# find . -type d -name "*"
    .
    ./backup

    注意,-type d不带任何参数时,会示显以.扫尾的文件,与通配符"*"一样。

        

    我们还可以根据文件巨细查找,可所以等于、大于、或者小于指定的巨细。通过应用巨细的上下边界,我们可以查找其巨细在某一围范的文件。认默况情下-size应用的巨细位单是512个字节的block。可以指定c(字节),k(千字节)。上面例子中,我们首先查找巨细为0的全部的文件,然后查找巨细为24或25字节的文件。注意-empty 和 -size 0的作用同相。

        


    [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中,作操是必须的,否则不会有任何输出。

        

    其他的作操括包-ls,其输出信息格式与ls -lids同相, -exec会对查找到的每个文件行执指定的令命。-exec必须以;尾结,因为shell也应用;这个字符,所以请先转义它。应用{}来引用find的查找结果,{}也是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选项的能力超出你的想象,例如:

        

    find . -empty -exec rm '{}' \;

        


        

    除删全部以后目录下的空文件。

        


        

    find  .  -name "*.htm" -exec mv '{}' '{}l' \;

        


        

    把全部.htm文件修改为.html文件。

        


        

    最后一个关于find的例子中,我们将会利用文件的时光戳来定位文件。

        


    [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

    1. 当应用-mtime -2时,find令命会查找最近2天(48小时内)修改的文件。一天就是于对相以后时光的24小时。如果想根据问访时光而不是修改时光,那么应用-atime代替-mtime。
    2. 当应用-daystart时,则示表是按照日历的天来算的,而不是相对以后时光的24小时。
    3. 最后例子中,我们查找的时在过去60分钟-600分钟之内修改过的文件。

    识别文件

    文件名通常由一个后缀,如.gif,.jpeg,.html等,这用来暗示文件的类型。Linux不须要这样的后缀,并且通常也不应用它们来是被文件类型。文件的类型决定了查看或作操它的程序。file令命用来识别一个或者多个文件的类型。看例子:

        


    [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选项。

        

    file有许多的选项,请参考man手册页。上面例子应用了-i或者--mime选项来把文件的类型示显为MIME字符串,而不是一般的供人类阅读的文本。

        


    [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手册页。

        

    注意:ImageMagic包里还有一个identity令命,它用来识别图像文件,能够给出更多的图像文件信息。

        


        

    压缩文件

        

    当份备或者挪动文件时,通常须要压缩。Linux中有两个常用的压缩令命,gzip和bzip2,其中gzip应用的是Lempel-Ziv压缩算法,而bzip2应用的是Burrows-Wheeler块序排算法。

        


        

    应用gzip和gunzip

        


        

    压缩通常在文本文件上工作的很好。很多图像文件经已是压缩过的了,所以再对其行进压缩的效果往往不好。为了演示压缩一个适当巨细的文件,我们制复/etc/services到我们的目录中,并且应用gzip压缩。我们应用了cp -p来坚持文件的时光戳。注意压缩后的文件与压缩前的文件应用同相的时光戳,并且以.gz为后缀。

        


    [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

        

    bzip2的应用方法与gzip相似。如下:

        


    [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的差异

    在设计时,bzip2的很多选项都与gzip同相,但是不并是完全同相。你可能经已注意到了,两个例子中解压后的文件都与原始的文件具有同相的文件名和时光戳。但是重命名或者touch压缩文件后将会变改种这结果。gzip令命由一个-N或者--name选项来强制坚持文件名和时光戳,但是bzip2没有。gzip还有个-l选项用来示显压缩文件以及解压后对应的文件名。上面的例子示显了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输出。
    对于bizp2还有其他两个令命:

        

    1. bzcat 压缩文件到标准输出,与bzip2 -dc同相;
    2. bzip2recover 试尝从损坏的bzip2文件中恢复数据。
    更多关于gzip和bzip2的信息请参看man手册页。

        


        

    其他压缩工具

        

    compress和uncompress这两个老的程序,仍然在Linux和Unix系统中被经常应用。

        


        

    除此之外,来自Info-Zip项的目zip和unzip令命也有Linux平台上的现实。这就为跨平台应用压缩功能供提了方便。注意不并是全部的作操系统都支撑同相的文件元信息或者文件系统能力。如果你下载了一个研所的程序然后在Windows系统上解压,然后通过CD或DVD把文件转移到Linux上,这样你可能会在安装这个程序是现出问题,因为Windows作操系统不支撑符号链接,而这却在原始的程序文件集合中被应用了。

        


        

    更多地压缩工具,参看man手册页。

        


        

    包打多个文件

        

    tar, cpio, dd令命经常被用来份备一组文件、甚至整个分区,于用存档或者转移文件到另一个用户或站点。LPIC-2的201试考专注于份备的细节。

        


        

    有三种通用的份备方法:

        


        

    1. 微分或累积份备。份备自上次完全份备以来发生变化的部分。恢复的时候,至少须要最后一个完全份备和最新的累积份备。
    2. 增量份备。份备自上次增量份备以来发生的变化部分。恢复的时候,须要最后一个完全份备,还有全部的增量份备(按顺序)。
    3. 完全份备。通常是整个文件系统或一组文件或目录的完整份备。种这方法须要的时光最长,所以它通常配合上面两种方法的一种来工作。
    应用这三个令命,再加上后面学习的那些令命,就能够完成任何的份备任务。

        


        

    应用tar

        

    tar,名字来自于 Tape ARchive,用来从一组输入的文件或目录中创立一个归档文件或者叫做tarfile,tarball,也能从归档文件中恢复出原始文件。如果tar的输入是个目录,全部的子目录和文件都会被动自包括进来,这使得应用tar来归档一个目录树时非常方便。

        


        

    tar的输出可以使一个文件、一个设备(如磁带或硬盘)或者是标准输出。输出通过-f选项来定位。其他的常用选项有:-c 创立一个归档文件;-x 从归档文件中抽取;-v 冗长的输出被理处的各个文件;-z应用gzip压缩;-j 应用bzip2压缩。大多数的tar令命选项有两种等价的格式,应用一个-扫尾的短格式和应用--扫尾的长格式。我们这里应用的时短格式。关于长格式、以及其他的选项请参考man手册页。

        


        

    上面的例子展示了应用tar来份备我们的Lpi103-2目录。

        


    [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选项。在创立归档文件时一定要避免混淆绝对路径和相对路径,因为从归档文件恢复的时候都是采用相对路径。

        

    tar令命的-r或--append选项可以向已有的归档文件中加入新的文件。这可能会致使一个文件的多份拷贝存在于归档文件中,在恢复的时候最后一个被恢复的拷贝将会覆盖后面的同名文件。你可以应用--occurrence选项来选择特定的文件来恢复。如果归档文件寄存在一般的文件系统中而不是磁带上,你可以应用-u或者--update选项来更新归档文件。这与向归档文件中添加文件相似,只是归档文件中的文件时光戳会和文件系统中的文件时光戳行进比较,只有修改过的文件才会被添加到归档文件中。经已说过了,这对于磁带归档文件不起作用。

        


        

    tar令命也于用比较归档文件和文件系统,以及从归档文件中恢复文件。应用-d或者--compare或者--diff选项来行执比较。输出会示显容内不同的文件,也会示显时光戳不同的文件。畸形况情下,只有有差异的文件被列出来。应用-v选项来输出更相信的容内。 应用-C或者--directory选项来告诉tar在一个指定的目录中开始工作,否则认默是在以后目录下。

        


        

    下例应用touch修改了f1的时光戳,然后在恢复之前比较归档文件。

        


    [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

        

    cpio令命应用copy-out模式来创立归档文件,应用copy-in模式来恢复文件,应用copy-pass模式来制复一组文件到其他位置。应用-o或者--create选项示表copy-out模式,应用-i或者--extract选项来应用copy-in模式,应用-p或者--pass-through选项来应用copy-pass模式。输入是在标准输入中给出的文件列表,输出可所以标准输出或者是一个设备或者是通过-f或者--file选项指定的文件。

        


        

    上面例子展示了应用find令命来生产文件列表,然后把结果通过管道传输给cpio。注意应用了find的-print0选项来生产0尾结的文件名字符串,同时应用cpio的--null选项来读取种这格式的字符串。这样一些包括空格或者换行符的文件名字也能畸形工作。-depth选项告诉find先列出目录的容内,在列出目录自身。在本例中,我们简单地创立了lpi103-2目录的两个归档文件,一个应用了相对路径名,另一个采用了绝对路径名。我们没有应用find的更多能力来限制查找文件的结果,比如只选择本周修改的文件。

        


    [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选项。

        

    cpio工作在copy-in模式时,可以列出归档文件中容内,以恶可以恢复选择的文件。

        


        

    可以应用--absolute-filenames 选项来减少一些老版本cpio的输出消息,这些老版本的cpio会去掉扫尾的/。在许多现代版本的cpio中,这个选项将会被忽略。上面的例子有选择地列出归档文件中的文件列表。

        


    [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 令命

        

    dd的最简单方法就是制复一个输入文件到一个输出文件。我们经已知道了cp令命,所以可能会质疑为什么还须要另外一个制复文件的令命呢?dd令命可以比cp做更多的事情。尤其是dd能够在文件上行执转换,比如把小写字符转换为大写字符,或者把ASCII编码转换为EDCDIC编码。dd还能够重组一个文件,这文件在转移到磁带之前是必须的。它还可以忽略或者只制复文件的指定的部分。最后,dd能够读写原始设备,比如/dev/sda,这可以用来份备和恢复整个磁盘分区。想设备写入通常须要root权限。

        


        

    我们从应用conv选项来把文件中字符大写的小例子开始。我们应用 if选项来指定输入文件而不采用标准输入。相似,of选项用来指定输出的目来代替标准输出。为了演示,我们输入输出时采用了不同的块巨细,这通过ibs和obs选项来指定。当在磁盘和磁盘之间传送数据的时候,应用大块来加速作操是非常方便的。此外,块巨细通常于用磁带设备。最后三行是运行状态,示显了读写了多少个整块以及部分块,以及传送的全部数据巨细。

        


    [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,可以份备到磁带中或者一个文件中。理想的况情下,份备时设备上的文件系统应该被载卸或者至少是只读挂载的,这样才能确保份备的程过中数据不会发生变改。

        

    上面的例子中,我们把/dev/sda6这个裸设备份备成/root/backup-1这个文件。如果是份备到磁带或者软盘上,则须要指定of=/dev/fd0或者of=/dev/st0。

        


    [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
    


        

    gzip使得文件巨细减少了很多,但是由于分区中尚未应用的块中也可能包括任意数据,所以即使是压缩了的文件,其巨细仍然远远大于分区中的实际应用部分。

        


        

    如果用总的字节数除以记录数,你会发现dd应用的块巨细是512个字节。当制复的目是一个像磁带这样的设备时,这将致使非常低效。后面我们说过可以通过obs和ibs别分指定输入和输出块的巨细,也可以通过bs来为输入和输出指定一样的块巨细。当应用磁带时,记住读取和写入的块巨细要一致才行。

        


        

    如果你须要多个磁带或者其他的挪动设备来寄存你的份备时,你须要应用split这样的工具来分割大文件。如果你须要忽略如磁盘和磁带的标签时,你可以应用dd做到,请参考man手册页。

        


        

    dd令命对于文件系统一无所知,所以你须要恢复镜像文件到一个分区来查看里面的容内。上面例子演示了应用刚才创立的镜像文件来恢复一个分区,这个分区存在于一个挪动硬盘上。

        


        

    译者注:本验实译者没做,没找到合适的挪动硬盘。

        


        

    也许你对这样一个事实会感兴致,那就是有些CD和DVD烧录程序底层实际上就是应用了dd来行进实际的设备写入作操。如果你应用的烧录程序供提一个实际行执令命的日志,既然我们经已知道了dd这个令命的一些知识,那么查看这些日志将会非常有意思。实际上,当你烧录一个ISO镜像文件到CD或者DVD光盘上时,一种检测烧录否是功成的方法就是应用dd来读取光盘的容内然后通过管道交由cmp令命来和镜像文件行进比较。下例展示了种这通用的技术,只是应用的文件是我们刚刚创立的份备文件而不是ISO镜像。注意我们应用份备文件的巨细来计算要读取的块数量。

        


        


        译者注:本验实译者没做,没找到合适的挪动硬盘。

        

        

    文章结束给大家分享下程序员的一些笑话语录: 小沈阳版程序员~~~ \n程序员其实可痛苦的了......需求一做一改,一个月就过去了;嚎~ \n需求再一改一调,一季度就过去了;嚎~ \n程序员最痛苦的事儿是啥,知道不?就是,程序没做完,需求又改了; \n程序员最最痛苦的事儿是啥,知道不? 就是,系统好不容易做完了,方案全改了; \n程序员最最最痛苦的事儿是啥,知道不? 就是,系统做完了,狗日的客户跑了; \n程序员最最最最最痛苦的事儿是啥,知道不? 就是,狗日的客户又回来了,程序给删没了!

  • 相关阅读:
    ASP.NE网站发布注意事项
    jQuery中使用$.ajax提交表单
    DataTable类Clone及Copy方法的区别
    DataList控件使用初步
    一个非常标准的Java连接Oracle数据库的示例代码
    详细解析用C#写的小游戏《彩色连珠》(附源代码)
    VS 2010 复制代码到word出现乱码解决办法
    Java之简单的图片动态显示(实现类似GIF动画效果)
    Class.forName(String driverClassName)加载JDBC驱动程序时,底层都做了些什么???
    Java设计好看的窗体必加的代码(使用内置皮肤控件):
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3069676.html
Copyright © 2020-2023  润新知