下面介绍的是程序包管理的前端工具yum、程序包管理器编译安装、sed命令、find文件查找。

一、Linux程序包管理:程序包管理的【前端工具】

1、yum软件包仓库简介

CentOS系的管理工具有yum和dnf。yum是一款发行版的Linux,其使用的默认程序包管理工具为rpm。

URL是yum定位软件包仓库和仓库中程序文件的主要标识方式,表示如下:

   例如:schema://[username@]hostname/PATH/TO/DOCUMENT[paramers][methord]

   (例子中的Web站点可以表示为http/https,即具体实例可以为:http://www.163.com)

yum是【C/S】架构,其中的服务器称为软件仓库,即yum仓库。yum在客户端需要书写URL以指定服务器及程序包路径;在服务器上,软件仓库就是一个目录,在此目录中包含了程序包文件和元数据文件。而元数据文件统一存放在repodate的目录中,也可以说成,repodate目录所在的路径即为软件仓库的命令。

常用的第三方yum仓库有Fedora和EPEL,可以到官方站点或镜像站点中,下载epel-release程序包,并且使用rpm命令安装至对应的Linux发行版本,在/etc/yum.repos.d目录中,会多出一个epel.repo的文件,更新repolist即可使用。其中,要求Linux虚拟机能够连接互联网;


2、创建本地yum仓库:createrepo命令

createrepo:(createrepo - Create repomd (xml-rpm-metadata) repository)

格式:createrepo [options]

    格式中的 存放程序包的目录

    例如:createrepo /PATH/TO/PACKAGES

# yum-config-manager --add-repo=URL

显示:已加载插件:fastestmirror, refresh-packagekit

      adding repo from: URL

      [URL]

      name=added from: URL

      baseurl=URL

      enabled=1


3、yum的C/S架构中【客户机】的使用

用户自定义的repository的指向信息,可以写在主配置文件中;也可以将用户自定义的repository的指向信息,以.repo为文件后缀名,并且存放于/etc/yum.repos.d目录中。

(1)、主配置文件

主配置文件:/etc/yum.conf;其只提供yum仓库指向信息的公共配置内容。

    注意:该文件一般情况下,不进行任何修改。

yum的【主配置文件】在下列目录文件中:/etc/yum.conf。其中的信息是ini风格的配置信息模式,即分段式配置内容,具体分段式如下所示:

    [repositoryid]

    statements   

注意:所有的配置语句,其生效范围是从第一个[]开始,带下一个[]结束,具体示例如下所示:

    [repo1]

    statements

    [repo2]

    statements

注意:a.repository必须全局唯一

      b.repository不能包括.和_之外的任何特殊字符,可以包含字母和数字,字母严格区分大小写机制。

yum主配置文件具体代码显示如下:

# yum /etc/yum.conf

[main]

cachedir=/var/cache/yum/$basearch/$releasever

keepcache=0

debuglevel=2

logfile=/var/log/yum.log

exactarch=1

obsoletes=1

gpgcheck=1

plugins=1

installonly_limit=5

bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum

distroverpkg=centos-release


例中的$releasever、$basearch为yum配置文件的变量,具体如下:

$releasever:当前操作系统的发行版本的主版本号;

例如:CentOS 7.2-1511,其发行版本的主版本号是7,即$releasever为7

     CentOS 6.7,其发行版本的主版本号是6,即$releasever为6


$basearch:当前计算机所使用的基础平台架构类型;

例如:Intel兼容机$basearch如下两种:

 i686

 x86_64

     apple计算机设备$basearch如下两种:

 ppc

 ppc64


(2)、片段配置文件:/etc/yum.repos.d/*.repo

片段配置文件中,每一个以.repo为后缀名的文件,即为一个仓库文件;这样的每个文件中可以配置指向一个或多个yum仓库。

yum程序在【查找yum仓库】的时候,是根据这些配置文件来查找的;每一次可能会找到多个yum仓库,从所有可以使用的仓库中查找最新版本的程序包并缓存到本地进行安装,升级等操作。

同类的多个仓库被称为镜像,只要有一个可用即可;不同类的仓库也可以同时存在多个,yum可以同时使用这些仓库。


4、.repo文件的定义

 .repo定义格式如下:

[repositoryid]

name=Full name of repository

baseurl=schema1://hostname/PATH/TO/REPODATA

        schema2://hostname/PATH/TO/REPODATA

schema3://hostname/PATH/TO/REPODATA

schema4://hostname/PATH/TO/REPODATA

#mirrorlist=mirror_url

enabled={0|1}

gpgcheck={0|1}

gpgkey=schema://hostname/PATH/TO/PUBLIC_KEY_FILE

failovermethod={roundrobin|priority}

enablegroups={1|0}

cost=num

定义格式中,各段解释如下: 

schema可以为以下两类: http[s]、ftp、nfs:网络服务器指向;

             file:本地服务器指向。

enabled={0|1}:0表示禁用此仓库指向;

               1表示启用;如果没有enabled语句,默认为启用状态。

gpgcheck={0|1}:0表示不进行程序包认证;

                1表示认证;如果为1,需要指定认证所需要的公钥文件,需要使用gpgkey语句。

gpgkey=schema://hostname/PATH/TO/PUBLIC_KEY_FILE

   例如:gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever

failovermethod={roundrobin|priority} 故障倒换方法,两种模式具体如下:

roundrobin:随机查找,默认的方法;

priority:按照顺序依次选择

enablegroups={1|0}:0表示禁用;

                    1表示启用。

cost=num,默认所有仓库的开销值都是1000;

例:baseurl=https://mirrors.aliyun.com/epel/7/x86_64



一般的repo指向内容,具体例子如下:

[repoid]

name=

baseurl=

#mirrorlist=

enbaled=1

gpgcheck=0

#gpgkey=


5、yum命令(CentOS6)

yum:(yum - Yellowdog Updater Modified)

格式:yum [options] [command] [package ...]

(1)、[options]

    -y, --assumeyes:对于yum执行过程中与用户交互的问题,全部以yes回答。

-q, --quiet:安静模式,在某一次yum执行过程中,没有任何信息输出到stdout。

--enablerepo=repoidglob 启用

--disablerepo=repoidglob 禁用

在某一次yum执行过程中明确的规定启用或禁用某个repository指向;在使用了这样的选项之后,仓库指向文件中的enabled语句的作用将失效。

--noplugins:在某一次yum执行过程中,明确指出不使用任何插件。

--nogpgcheck:在某一次yum执行过程中,明确指出不验证程序包完整性,在仓库指向文件中的gpgcheck=1语句会失效。

(2)、[command]

* install package1 [package2] [...]  安装程序包

        注意:a.如果只是给出程序包名称,yum搜索所有仓库,并找到最新版本缓存安装;

         b.如果给出程序包的名称及版本,则查找安装指定版本的程序包;

         c.如果给出的程序包是完整的程序包名,则只是查找某一个程序包;

         d.程序包名称可以使用globbing,(* ? [] [^])


    * update [package1] [package2] [...]  程序包升级

    * update-to [package1] [package2] [...]

    * check-update

    * upgrade [package1] [package2] [...]

    * upgrade-to [package1] [package2] [...]

    * downgrade package1 [package2] [...]  程序包降级

 

    * remove | erase package1 [package2] [...]  卸载程序包

       

    * list [...]  

        例如:yum list LIST OPTIONS

            LIST OPTIONS为:

                all: 显示所有的程序包,包括已经安装的和尚未安装但可用的。注意:anaconda:其CentOS系统的安装器,在安装操作系统的时候一并安装的程序包;# yum list all

           installed:显示所有已经安装的程序包;   # yum list install

           available:显示所有尚未安装但可以安装的程序包; # yum list available

        updates:显示所有可以升级更新的程序包; # yum list updates


    * info [...]  详细信息

        例如:yum info LIST OPTIONS

        LIST OPTIONS为:

        all: 显示所有的程序包,包括已经安装的和尚未安装但可用的。注意:anaconda:为CentOS系统的安装器,在安装操作系统的时候一并安装的程序包; # yum info all 

        installed:显示所有已经安装的程序包;   # yum info install

        available:显示所有尚未安装但可以安装的程序包; # yum info available

        updates:显示所有可以升级更新的程序包;  # yum info updates

            name[globbing]


    * provides | whatprovides feature1 [feature2] [...]

           【查看指定的特性】是由哪个程序包提供的;


    * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

        清理本地缓存信息


    * makecache  构建缓存


    * groupinstall group1 [group2] [...]  程序包组安装

    * groupupdate group1 [group2] [...]   程序包组更新

    * grouplist [hidden] [groupwildcard] [...]  程序包组显示

    * groupremove group1 [group2] [...]  程序包组删除

    * groupinfo group1 [...]  程序包组详细信息

       

    * search string1 [string2] [...]

        根据关键字进行匹配,默认情况下,搜索程序包名称及汇总信息;这是一种模糊搜索。


    * shell [filename]

        给yum提供一个【交互式命令的操作界面】


    * localinstall rpmfile1 [rpmfile2] [...]  本地程序包安装

           (maintained for legacy reasons only - use install)

    * localupdate rpmfile1 [rpmfile2] [...]

           (maintained for legacy reasons only - use update)

        实现本地程序包安装,即:不依赖于软件仓库,直接对rpm格式包文件进行操作。这两个命令已经被停用,使用install和update取代。


    * reinstall package1 [package2] [...]  重新安装


    * deplist package1 [package2] [...]  显示每个程序包所有的依赖关系;


    * repolist [all|enabled|disabled]  元数据信息

        列表显示yum仓库的元数据信息;在没有给出后面的参数的时候,默认为enabled;


    * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]


    * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

       查看yum事务的历史;安装、升级、卸载等操作的时候,yum会开启事务;


    * load-transaction [txfile]

        重新启动已经停止的事务;


    * check  认证


    * help [command]


6、CentOS7中的yum命令

CentOS7中的yum命令与CentOS6中的yum命令不同点为,程序包组的管理命令不同:

* groups [...]

groups {install | remove | list | info | update}

        别名:groupinstall groupremove grouplist groupinfo groupudpate


* autoremove [package1] [...]   自动卸载


    * repoinfo [all|enabled|disabled]


7、yum的repo配置文件中的【变量】:

$releasever:当前操作系统的发行版本的主版本号;

例如:CentOS 7.2-1511,其发行版本的主版本号是7,即$releasever为7

     CentOS 6.7,其发行版本的主版本号是6,即$releasever为6


$basearch:当前计算机所使用的基础平台架构类型;

例如:Intel兼容机$basearch如下两种:

 i686

 x86_64

     apple计算机设备$basearch如下两种:

 ppc

 ppc64


$arch:平台架构类型

$YUM0~$YUM9:yum内置的由用户自定义的10个变量;

    例如:.repo中baseurl=https://mirrors.aliyun.com/epel/7/x86_64



8、为什么要用这些变量

 因为服务器(repository)必须能够提供所有的常有发行版本及平台相关的程序包,但是服务器无法预测任何一个客户端具体的版本使用情况,所以应用变量来进行替换,让用户使用时自行选择。




二、CentOS程序包管理器之编译安装

1、为什么要进行源代码编译安装?

    a.对应的程序包并不能直接获取到;

b.已经编译好的二进制中,尚不包含我们所需要的功能;

c.已经编译好的二进制中,包含的功能太多,我们并不需要;

2、两种源代码包:

  (1)、由程序员直接打包的源代码:name-VERSION.tar.gz

  (2)、由第三方利用rpm工具制作的rpm源代码包:name-VERIONS-release.src.rpm ;/usr/src/name-VERIONS

3、源代码的组织形式:

  (1)、多文件组成

  (2)、文件中的代码之间,甚至是不同文件的代码段之间都可能存在依赖关系;

4、源代码的项目管理工具:

  (1)、C/C++项目管理工具:make

  (2)、Java项目管理工具:maven

5、源代码编译安装过程:

源代码 --> 预处理(预处理器,cpp) --> 编译(编译器,gcc) --> 汇编(汇编器) --> 链接(链接器) --> 用于执行操作的二进制文件

6、源代码文件

  针对于每个需要编译的源代码文件,都可能会有一个或多个被他依赖的文件或他【所依赖的文件】,这样的信息会被保存到一个配置文件中;这个配置文件会告诉我们:

  (1)、调用哪个预处理器,如何进行预处理;

  (2)、调用哪个编译器,如何进行编译;

  (3)、文件的编译顺序等等;

源代码文件一般是【makefile文件】,这样的makefile文件并不是事先存在的,也不是对所有用户的需求都一视同仁的。程序员可以使用专用的工具,来对于所有的源代码文件进行【内容分析和抽取】,构建出makefile文件。所有的makefile文件都有一个统一的【模版】,即【Makefile.in】。用户可以根据自己的需要,自行构建makefile文件,从而实现能够满足自己需求的编译过程。其中,帮助用户生成makefile文件的,通常是一个名为【configure的脚本文件】。

7、两种开发工具:

  (1)、autoconf:帮助用户生成configure脚本

  (2)、automake:帮助用户生成Makefile.in的模版文件

对于任何的源代码包,在解压缩之后,都会提供INSTALL或README的文档文件,我们在编译操作之前,最好先查阅此类文件的内容, 以【确定编译过程】。

8、开源程序源代码的两种获取方式:

  (1)、官方自建的站点:

apache.org(ASF)

mariadb.org

  (2)、代码的托管站点

SourceForge

Github

code.google.com

对源代码编译时常用到的编译器为:gcc (GNU C Complier)


9、【开发环境】的安装的两个步骤:

   步骤一:

   CentOS7:yum groups install "开发工具" 或:yum groups install "Development Tools"

   CentOS6:yum groupinstall "Development Tools" "Server Platform Development" "Desktop Platform Development"

   步骤二:

   yum install make automake autoconf gcc glibc qt ncurses


10、Linux系统中的【编译安装程序】的三大步骤:

  (1)、configure [options...]

  (2)、make

  (3)、make install

第一步:./configure [options...] [VAR=VALUE]...

    常用选项[options...]:

(1)、安装路径的设定:

--prefix=/PATH/TO/SOMEWHERE

指定默认的程序安装路径,如果不给该选项,默认路径/usr/local/

--sysconfdir=DIR

指定配置文件的安装路径

     (2)、系统类型:

(3)、可选特性:

--disable-FEATURE

在编译过程中禁用某种特性或功能

--enable-FEATURE[=ARG]

在编译过程中启用某个特性或功能

     (4)、可选程序包:

--with-PACKAGE[=ARG]

在编译过程中,选择使用额外的程序包

--without-PACKAGE

在编译过程中,不使用额外的程序包

第二步:make

第三步:make install


11、编译收尾工作:

  编译安装之后,/usr/local/apache2里面会包含bin, sbin, etc, lib, lib64, include, man, ...,需要进行收尾工作,分别导出,具体如下。

   (1)、导出二进制文件:

创建一个文件: /etc/profile.d/httpd.sh

     export PATH=/usr/local/apache2/bin:/usr/local/apache2/sbin:$PATH

   (2)、导出库文件:

创建一个文件:/etc/ld.so.conf.d/httpd.conf

             /usr/local/apache2/lib64

             ldconfig [-v]

   (3)、导出头文件:

在/usr/include目录中,为编译安装的软件创建头文件的符号链接:

ln -sv /usr/local/apache2/include /usr/include/httpd

   (4)、导出帮助文件:

   CentOS6: /etc/man.config

新添加一行:MANPATH=/usr/local/apache2/man


CentOS7: /etc/man_db.conf

新添加一行:MANPATH_MAP=/usr/local/apache2/bin /usr/local/apache2/man


示例:写一个脚本,要求:

1.为用户提供所有磁盘的列表;

2.当用户选定磁盘之后,提示用户该操作有风险,询问是否继续;

3.如果用户选择no,则退出脚本;

4.如果用户选择yes,【抹除该磁盘上的所有分区】;

#!/bin/bash

#

select I in fdisk -l | grep -o "/dev/sd[a-z]\>" quit ; do

case $I in

/dev/sd[a-z])

read -p "操作有风险,是否继续? " CHOICE

[ -z $CHOICE ] && CHOICE=no

case $CHOICE in

yes)

dd if=/dev/zero of=$I bs=512 count=1

sync

sleep 1

sync

sleep 1

sync

;;

no)

break

;;

esac

;;

quit)

break

;;

*)

continue

;;

esac

done


12、举例安装httpd-2.4.18

  (1)、首先要解决开发工具环境;

   yum groupinstall "Development tools"

  (2)、使用适合httpd-2.4.18版本的apr及apr-util工具;

安装apr工具

~]# tar xf apr-1.5.2.tar.bz2 -C /usr/src

~]# cd /usr/src/apr-1.5.2

~]# ./configure --prefix=/usr/local/apr-1.5.2

~]# make

~]# make install

  (3)、安装arp-util工具

~]# tar xf apr-util-1.5.4.tar.bz2 -C /usr/src

~]# cd /usr/src/apr-util-1.5.4

~]# ./configure --prefix=/usr/local/apr-util-1.5.4 --with-apr=/usr/local/apr-1.5.2

~]# make

~]# make install

  (4)、需要安装pcre-devel以满足httpd的正则表达式使用需求;

yum -y install pcre-devel

  (5)、编译安装httpd:

   # tar xf httpd-2.4.18.tar.gz -C /usr/src

   # cd /usr/src/httpd-2.4.18

   # ./configure --with-apr=/usr/local/apr-1.5.2 --with-apr-util=/usr/local/apr-util-1.5.4

   # make

   # make install

   (6)、收尾:

  a.导出二进制文件:

 vim /etc/profile.d/httpd.sh

 export PATH=/usr/local/apache2/bin:$PATH

          source /etc/profile.d/httpd.sh

       b.导出库文件:

 vim /etc/ld.so.conf.d/httpd-x86_64.conf

 /usr/local/apache2/modules

          ldconfig -v

       c.导出头文件:

 ln -sv /usr/local/apache2/include /usr/include/httpd

三、sed命令

1、sed简介

sed:Stream EDitor,即流编辑器,以行为单位对一个或多个文件进行编辑处理;每一次sed都会处理给定文件中的【一行内容】。

在sed处理文本时,将正在处理的当前行存储到临时的缓冲区中,称为“模式空间”;用当前行去匹配给定的PATTERN,如果能匹配,则使用command编辑处理;如果不匹配,则默认输出至标准输出;然后继续处理下一行,直到文件的末尾。

默认情况下,sed的所有处理行为不会影响源文件的内容。我们一般会使用sed命令来自动编辑一个或多个文件,简化对文件的【循环操作】。

2、sed命令

(sed - stream editor for filtering and transforming text)

格式:sed [OPTION]... 'script' [input-file]...

   (1)、常用选项[OPTION]:

   -n, --quiet, --silent:对于不能匹配模式的行,默认不输出到屏幕;

-e script, --expression=script:多条件编辑;

-f script-file, --file=script-file:从指定的script-file中读取脚本

注意:script-file为一个能够定位到脚本文件的路径,最好为绝对路径

-i[SUFFIX], --in-place[=SUFFIX]:原文件直接编辑操作;

-r, --regexp-extended:使sed支持扩展正则表达式;

   (2)、script部分:'AddressesCommand'

        Addresses(地址定界):

1.空地址:对所有文件的所有行进行处理;

2.单地址:sed对于能够匹配该地址的那唯一一行进行处理;

num:表示行号;

/pattern/:能够匹配该模式的所有行;

$:表示文档最后一行

3.地址范围:

addr1,addr2:从addr1开始到addr2结束的中间所有行;

例如:2,8

first~step:从first标记的行号开始,以step所代表的数字为步长;

例如:1~2, 2~2

addr1,+N:从addr1开始,包括addr1所在行,并继续向后计算N行;

例如:2,+7相当于2,2+7

addr1,~N:从addr1开始,包括addr1所在行,向后计算addr1*N行;

例如:2,~5相当于2,2*5

/pattern1/,/pattern2/:从被pattern1匹配的第一行开始计算,一直到被/pattern2/匹配到的第一行结束;

        Command(处理命令):

=:显示被模式匹配的行的行号

例如:sed -n '/^$/=' /etc/grub2.cfg

a \text:在被模式匹配的行的后面追加text的内容,支持使用\n换行,从而实现多行追加;

i \text:在被模式匹配的行的前面插入text的内容,支持使用\n换行,从而实现多行插入;

c \text:将被模式匹配的行的修改为text的内容,支持使用\n换行,从而实现一行变多行;

d:在模式空间中删除被模式匹配的行;这样的行不能再进行标准输出;

注意:在使用d命令的时候,不宜使用-n选项;

p:显示模式空间中被模式匹配的行;

注意:在使用p命令的时候,通常会搭配-n选项;

w filepath:将模式空间中被模式匹配的行,另存到filepath文件中;

r filepath:将filepath文件的内容追加至模式空间中被模式匹配的行之后;

!Command:在模式空间中被模式匹配的行,不执行Command命令;相反,未被模式匹配的行,参会执行Command命令

s///:查找替换,分隔符可以任意更换,只要相同即可;

s@@@, s###, s,,,

s/pattern/text/[control]

s@/etc/fstab@/etc/mtab@

                pattern:计划查找并替换的内容

text:要替换的结果

control:如何进行替换

g:行内全部替换

p:显示替换成功的行

w: filepath:将替换成功的行另存到filepath文件中;

s///支持后向引用:

s/\(string\)/&/

s/\(string\)/\1/

   (3)、高级编辑命令:

h: 把模式空间中的内容覆盖至保持空间中

H:把模式空间中的内容追加至保持空间中

g: 从保持空间取出数据覆盖至模式空间

G:从保持空间取出内容追加至模式空间

x: 把模式空间中的内容与保持空间中的内容进行互换

n: 读取匹配到的行的下一行覆盖至模式空间

N:追加匹配到的行的下一行至模式空间

d: 删除模式空间中的行

D:删除多行模式空间中的所有行

    示例:sed -n 'n;p' FILE

 sed '1!G;h;$!d' FILE

 sed '$!N;$!D' FILE

 sed '$!d' FILE

 sed ‘G’ FILE

 sed ‘g’ FILE

 sed ‘/^$/d;G’ FILE

 sed 'n;d' FILE

     sed -n '1!G;h;$p' FILE


四、文件查找:按照文件名或文件属性来搜索文件

1、locate命令

locate是【模糊查找】,其不是扫描这个系统,而是基于专用的数据库进行查找,这个数据库应该事先创建,并且定期更新。locate查找速度非常快,查找精确度非常有限。

可以使用updatedb命令手动更新locate数据库。

2、find命令

find是【精确查找】,查找精度高,速度慢。在指定的位置进行文件名或文件属性进行遍历扫描,强烈不建议对操作根目录进行find。

find是实时查找,使用find命令只能搜索当前用户具有读取和执行权限的命令

find命令:

(find - search for files in a directory hierarchy)

 格式:find [OPTIONS……] [查找路径] [查找条件] [处理动作]

   [查找路径]:默认为当前工作目录,可以指定具体的命令路径。

   [查找条件]:进行本次搜索的标准,可以是文件名、文件大小、文件类型、文件权限等等:默认是指定

目录中的所有文件。

   [处理动作]:对于符合条件的文件进行某个处理操作;默认将查找结果输出到显示器。


[查找条件]

(1)、根据文件名查找:

    -name 文件名称,支持使用Globbing,(*, ?, [], [^])

-iname 文件名称,忽略字母大小写,支持使用Globbing,(*, ?, [], [^])

(2)、根据文件的inode编号进行查找:

    -inum inode编号:通过给定的inode编号查找对应的文件名及路径;

-samefile name:通过给定的文件名查找对应的inode编号,进而确定所有具有该inode编号的文件名及路径;

-links n:查找链接数为n的所有文件;

    # find / -inum 802210

    # find / -samefile test

    # find / -link 3 查找所有链接为3的文件

(3)、根据正则表达式来查找:

    -regex pattern:以pattern匹配整个文件路径字符串,而不仅仅是给定文件的名称;

(4)、根据文件的属主和属组进行查找:

    -user uname:根据属主为指定用户的用户名进行查找

-uid UID:根据属主为某个UID进行查找

-group gname:根据属组名查找

-gid GID:根据属组GID查找

        -nogroup:在文件的属组上没有组对应的组名;在文件的属组上没有组对应的组名,但是依旧有数字化UID和GID。

-nouser:在文件的属主上没有用户对应的用户名;

(5)、根据文件类型查找:

   格式1:-type 文件类型

   具体文件类型如下:

     b:块设备

c:字符设备

d:目录文件

f:普通文件

l:符号链接文件

p:管道文件

s:套接字文件

   格式2:-xtype 文件类型 :符号链接文件到的匹配需要配合其他选项,其余与type相似。

(6)、根据时间戳进行查找:

    以天为单位:

-atime [+|-]n:根据访问时间查找

-ctime [+|-]n:根据改变时间查找

-mtime [+|-]n:根据修改时间查找

   n: 即[n,n+1],表示前(n+1)天和前n天之内这段期间————中段

           +n:即[n+1,无穷],表示前(n+1)天以前的事————前段

           -n:即[now,n],表示前n天到现在这段时间————后段

    以分钟为单位:

-amin [+|-]n:根据访问时间查找

-cmin [+|-]n:根据改变时间查找

-mmin [+|-]n:根据修改时间查找

    例子:5-28-11-18 

      -mtime -3

  5-25-11-18

      -mtime 3

          5-24-11-18

      -mtime +3

(7)、根据文件大小进行查找:

-size [+|-]n[cwbkMG]

     n:(n-1,n]

     -n:[0,n-1],表示比n小的部分

     +n:(n,+∞)

    例子:find -size +2k

当前目录下所有大于2KB的文件;

          find -size 2k

        当前目录下所有1KB-2KB之间的文件;

  find -size -2k

        当前目录下所有小于1KB的文件

(8)、根据权限进行查找:

    -perm [/|-]mode

mode:精确匹配指定的权限

/mode:隐含了逻辑或的关系,任何一个权限位的权限中只要能有一个权限匹配,即可满足条件;

-mode:隐含了逻辑与的关系,每一个权限位的权限中都必须同时包含指定权限位,才能满足条件

    # find -perm 640

    # find -perm /444 只要一个有读权限就匹配

    # find -perm /540 即 # find -perm /444 -a -perm /100

    # find -perm -444 三个读权限必须同时存在才匹配

    # find -not -perm /222 没有写权限才匹配


组合条件:

-a:逻辑与,默认可以省略;

-o:逻辑或

-not, !:逻辑非

 # find -nouser -nogroup

 # find -nouser -o -nogroup


[处理动作]

(1)、-print

 -print:输出到显示屏幕,默认的动作

(2)、-ls

-ls:对与查找到的结果执行ls -li命令显示

(3)、-exec COMMAND {} \; 对于查找到的结果执行COMMAND命令

  区别:-exec是非交互式的;

        -ok是交互式的;

       {}:占位符,用来引用被find命令查找到的所有的文件的路径信息;

       -exec和-ok的取代执行操作:

    chmod a-r $(find -perm -444 -type f)

    find -perm -444 -type f | xargs chmod a-r

  注意:管道输送的是纯字符串信息,所以如果管道之后的命令不是处理字符串的命令,需要使用xargs命令将其转换成能够被后面命令处理的参数;

 # find -perm -444 -type f -exec chmod a-r {} \;

   即:# chmod a-r $(find -perm -444 -type f)

 # find -not -perm /444 -type f -exec chmod a+r \;

   即:# chmod a+r $(find -not -perm /444 -type f)

 # find -perm -444 -type f | chmod a-r 运行【失败】,因为chmod处理的不是字符串

 # find -perm -444 -type f | tr 'a-z' 'A-Z' 运行【正确】,因为tr处理的本来就是字符串。grep处理的也是字符串,所以也可以运行成功。

 注意:管道输送的是纯字符串信息,所以如果管道之后的命令不是处理字符串的命令,需要使用xargs命令将其转换成能够被后面命令处理的参数

(4)、-ok