-

在网络上,人们越来越倾向于传输压缩格式的文件,原因是压缩文件体积小,在网速相同的情况下,传输时间短。下面将学习如何在Linux系统中对文件进行打包压缩与解压,以及让用户基于关键词在文本文件中搜索相匹配的信息、在整个文件系统中基于指定的名称或属性搜索特定文件。本节虽然只有3条命令,但是其功能都比较复杂而且参数很多,因此放到了本章最后讲解。

1.tar命令

tar命令用于对文件进行打包压缩或解压,格式为“tar [选项] [文件]”。

在Linux系统中,常见的文件格式比较多,其中主要使用的是.tar或.tar.gz或.tar.bz2格式,我们不用担心格式太多而记不住,其实这些格式大部分都是由tar命令来生成的。刘遄老师将讲解最重要的几个参数,以方便大家理解。tar命令的参数及其作用如表2-14所示。

表2-14 tar命令的参数及其作用

    参数  作用
    -c  创建压缩文件
    -x  解开压缩文件
    -t  查看压缩包内有哪些文件
    -z  用Gzip压缩或解压
    -j  用bzip2压缩或解压
    -v  显示压缩或解压的过程
    -f  目标文件名
    -p  保留原始的权限与属性
    -P  使用绝对路径来压缩
    -C  指定解压到的目录

首先,-c参数用于创建压缩文件,-x参数用于解压文件,因此这两个参数不能同时使用。其次,-z参数指定使用Gzip格式来压缩或解压文件,-j参数指定使用bzip2格式来压缩或解压文件。用户使用时则是根据文件的后缀来决定应使用何种格式参数进行解压。在执行某些压缩或解压操作时,可能需要花费数个小时,如果屏幕一直没有输出,您一方面不好判断打包的进度情况,另一方面也会怀疑电脑死机了,因此非常推荐使用-v参数向用户不断显示压缩或解压的过程。-C参数用于指定要解压到哪个指定的目录。-f参数特别重要,它必须放到参数的最后一位,代表要压缩或解压的软件包名称。刘遄老师一般使用“tar -czvf 压缩包名称.tar.gz 要打包的目录”命令把指定的文件进行打包压缩;相应的解压命令为“tar -xzvf 压缩包名称.tar.gz”。下面我们来逐个演示下打包压缩与解压的操作。先使用tar命令把/etc目录通过gzip格式进行打包压缩,并把文件命名为etc.tar.gz:

    [root@linuxprobe ~]# tar czvf etc.tar.gz /etc
    tar: Removing leading `/' from member names
    /etc/
    /etc/fstab
    /etc/crypttab
    /etc/mtab
    /etc/fonts/
    /etc/fonts/conf.d/
    /etc/fonts/conf.d/65-0-madan.conf
    /etc/fonts/conf.d/59-liberation-sans.conf
    /etc/fonts/conf.d/90-ttf-arphic-uming-embolden.conf
    /etc/fonts/conf.d/59-liberation-mono.conf
    /etc/fonts/conf.d/66-sil-nuosu.conf
    ………………省略部分压缩过程信息………………

接下来将打包后的压缩包文件指定解压到/root/etc目录中(先使用mkdir命令来创建/root/etc目录):

    [root@linuxprobe ~]# mkdir /root/etc
    [root@linuxprobe ~]# tar xzvf etc.tar.gz -C /root/etc
    etc/
    etc/fstab
    etc/crypttab
    etc/mtab
    etc/fonts/
    etc/fonts/conf.d/
    etc/fonts/conf.d/65-0-madan.conf
    etc/fonts/conf.d/59-liberation-sans.conf
    etc/fonts/conf.d/90-ttf-arphic-uming-embolden.conf
    etc/fonts/conf.d/59-liberation-mono.conf
    etc/fonts/conf.d/66-sil-nuosu.conf
    etc/fonts/conf.d/65-1-vlgothic-gothic.conf
    etc/fonts/conf.d/65-0-lohit-bengali.conf
    etc/fonts/conf.d/20-unhint-small-dejavu-sans.conf
    ………………省略部分解压过程信息………………

2.grep命令

grep命令用于在文本中执行关键词搜索,并显示匹配的结果,格式为“grep [选项] [文件]”。grep命令的参数及其作用如表2-15所示。

表2-15 grep命令的参数及其作用

    参数  作用
    -b  将可执行文件(binary)当作文本文件(text)来搜索
    -c  仅显示找到的行数
    -i  忽略大小写
    -n  显示行号
    -v  反向选择——仅列出没有“关键词”的行。

grep命令是用途最广泛的文本搜索匹配工具,虽然有很多参数,但是大多数基本上都用不到。刘遄老师在总结了近10年的运维工作和培训教学的经验后,提出的本书的写作理念“去掉不实用”绝对不是信口开河。如果一名IT培训讲师的水平只能停留在“技术的搬运工”层面,而不能对优质技术知识进行提炼总结,那对他的学生来讲绝非好事。我们在这里只讲两个最最常用的参数:-n参数用来显示搜索到信息的行号;-v参数用于反选信息(即没有包含关键词的所有信息行)。这两个参数几乎能完成您日后80%的工作需要,至于其他上百个参数,即使以后在工作期间遇到了,再使用man grep命令查询也来得及。

在Linux系统中,/etc/passwd文件是保存着所有的用户信息,而一旦用户的登录终端被设置成/sbin/nologin,则不再允许登录系统,因此可以使用grep命令来查找出当前系统中不允许登录系统的所有用户信息:

    [root@linuxprobe ~]# grep /sbin/nologin /etc/passwd
    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
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    ………………省略部分输出过程信息………………

3.find命令

find命令用于按照指定条件来查找文件,格式为“find [查找路径] 寻找条件 操作”。

本书中曾经多次提到“Linux系统中的一切都是文件”,接下来就要见证这句话的分量了。在Linux系统中,搜索工作一般都是通过find命令来完成的,它可以使用不同的文件特性作为寻找条件(如文件名、大小、修改时间、权限等信息),一旦匹配成功则默认将信息显示到屏幕上。find命令的参数以及作用如表2-16所示。

表2-16 find命令中的参数以及作用

    参数  作用
    -name   匹配名称
    -perm   匹配权限(mode为完全匹配,-mode为包含即可)
    -user   匹配所有者
    -group  匹配所有组
    -mtime -n +n    匹配修改内容的时间(-n指n天以内,+n指n天以前)
    -atime -n +n    匹配访问文件的时间(-n指n天以内,+n指n天以前)
    -ctime -n +n    匹配修改文件权限的时间(-n指n天以内,+n指n天以前)
    -nouser 匹配无所有者的文件
    -nogroup    匹配无所有组的文件
    -newer f1 !f2   匹配比文件f1新但比f2旧的文件
    --type b/d/c/p/l/f  匹配文件类型(后面的字幕字母依次表示块设备、目录、字符设备、管道、链接文件、文本文件)
    -size   匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件)
    -prune  忽略某个目录
    -exec …… {}\;   后面可跟用于进一步处理搜索结果的命令(下文会有演示)

这里需要重点讲解一下-exec参数重要的作用。这个参数用于把find命令搜索到的结果交由紧随其后的命令作进一步处理,它十分类似于第3章将要讲解的管道符技术,并且由于find命令对参数的特殊要求,因此虽然exec是长格式形式,但依然只需要一个减号(-)。

根据文件系统层次标准(Filesystem Hierarchy Standard)协议,Linux系统中的配置文件会保存到/etc目录中(详见第6章)。如果要想获取到该目录中所有以host开头的文件列表,可以执行如下命令:

    [root@linuxprobe ~]# find /etc -name "host*" -print
    /etc/avahi/hosts
    /etc/host.conf
    /etc/hosts
    /etc/hosts.allow
    /etc/hosts.deny
    /etc/selinux/targeted/modules/active/modules/hostname.pp
    /etc/hostname

如果要在整个系统中搜索权限中包括SUID权限的所有文件(详见第5章),只需使用-4000即可:

    [root@linuxprobe ~]# find / -perm -4000 -print
    /usr/bin/fusermount
    /usr/bin/su
    /usr/bin/umount
    /usr/bin/passwd
    /usr/sbin/userhelper
    /usr/sbin/usernetctl
    ………………省略部分输出信息………………

进阶实验:在整个文件系统中找出所有归属于linuxprobe用户的文件并复制到/root/findresults目录。

该实验的重点是“-exec {} \;”参数,其中的{}表示find命令搜索出的每一个文件,并且命令的结尾必须是“\;”。完成该实验的具体命令如下:

    [root@linuxprobe ~]# find / -user linuxprobe -exec cp -a {} /root/findresults/ \;

在本章最后,刘遄老师再多提几句:很多读者初次接触到本书时都担心因为自己的英语基础不好而导致学不会Linux系统,其实大可不必担心,因为我们的图书、培训课程甚至红帽考题都是中文的。而在学习完本章后您也一定发现了,我们以后要使用的是Linux命令,而绝不是纯粹的英语单词,即便它们的拼写100%相同,最终用处肯定也是不一样的。因此就学习Linux系统技术来讲,您跟英语达人绝对都是站在同一起跑线上的,更何况还正确地选择了一本适合您的Linux教材。休息一下,然后开始学习第3章吧!