find命令使用及Linux任务调度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了find命令使用及Linux任务调度相关的知识,希望对你有一定的参考价值。

文件搜索和查找工具:
安装文件名或文件的属性来查找并定位文件的路径;
locate:模糊查找工具;
基于专用的数据库进行查找,但前提是数据库必须事先存在,而且需要定期更新;
查找速度非常快,但是查找精度十分有限,且仅限于数据库中包含的内容;
可以在特定的情况下,实施手动更新数据库,需要使用updatedb命令即可;

        /var/lib/mlocate/mlocate.db:locate查找的数据库文件;

    find:精确查找工具;
        查找精度非常高,但速度比较慢;
            在指定的位置通过文件名或其他文件的关键属性对文件进行遍历扫描; 
                注意:不建议对根目录进行find操作;
        实时查找;

        限制:使用find命令仅能完成当前用户有读和执行权限的目录的扫描查找;

find命令:
find - search for files in a directory hierarchy
find [path...] [expression]
path:查找路径;
默认为当前工作目录,也可以指定具体的查找目录的路径;
expression:
OPTIONS:
TESTS:查找条件;
实施本次查找的标准;既可以指定文件名,又可以指定诸如:文件大小,文件类型,文件权限和时间戳等;
ACTIONS:处理动作;
对于查找到的符合条件的文件进行某种指定的处理操作;默认值为将查找结果输出到标准输出;

        查找条件:
            根据文件名查找:
                -name pattern:文件名支持使用Globbing;(*,?,[],[^])
                [[email protected] ~]# find /etc/pass*
                /etc/passwd
                /etc/passwd-                    
                -iname pattern:忽略文件名中字母大小写的区别,而进行查找;支持使用Globbing;
                -samefile name:根据指定的文件的文件名,查找其它硬链接文件的路径;

            根据文件的inode号查找:
                -inum n:
                -links n:查找硬连接数为"n"的所有文件;
                -regex pattern:
                -iregex pattern:

            根据文件的所有权进行查找:
                -user uname
                -uid UID
                    就是根据用户名和/或用户ID,查找属主为这个用户账户的所有文件;
                -group gname
                -gid GID
                    就是根据组名和/或组ID,查找属组为这个组账户的所有文件;
                -nogroup:在文件的所有权的权限位上,没有属组名称仅显示属组ID的文件;
                -nouser:在文件的所有权的权限位上,没有属主名称仅显示属主ID的文件;

            根据文件的类型:
                -type c:
                    c表示文件类型的单字符描述符,其中包括:
                        b:块设备
                        c:字符设备
                        d:目录
                        f:普通文件
                        l:符号链接
                        p:管道
                        s:套接字
                -xtype c:
                    符号链接文件的查找结果需要其他选择的配合才能找到,否则查找的是被链接的原文件;

            根据时间戳进行查找:
                以天为时间单位进行查找:
                    -atime [+|-]n:根据访问时间戳进行查找
                    -ctime [+|-]n:根据改变时间戳进行查找
                    -mtime [+|-]n:根据修改时间戳进行查找

                         n:[n,n+1)
                        +n:[n+1,+oo)
                        -n:[now,n)

                以分钟为时间单位进行查找:
                    -amin [+|-]n:
                    -cmin [+|-]n:
                    -mmin [+|-]n:

            根据文件的大小进行查找:
                -size [+|-]n[cwbkMG]
                     n:(n-1,n]
                    +n:[n,+oo)
                    -n:[0,n-1]
             ~]# find /etc -size +2M
            逻辑运算操作符组合前面的条件进行复杂逻辑判断:
                -a | -and:逻辑与运算,默认就是该逻辑运算,可省略;
                -o | -or:逻辑或运算;
                -not | !:逻辑非运算;

                德摩根定律依然生效;

            根据权限查找:
                -perm [/|-]mode
                     mode:精确权限匹配,意思是查找必须与指定的权限位完全匹配的文件;
                    /mode:任何一个权限位的权限中只要有一个权限能够满足条件,即为匹配成功,就可以将之作为查找结果;隐含了逻辑或关系;
                    -mode:每一个权限位的权限中都必须同时包含指定的权限位,才能满足条件,才算匹配成功,将之作为查找结果;隐含了逻辑与关系;

                    真  取反  假
                    假  取反  真
                    全部为真  取反  任何一个为假
                    全部为假  取反  任何一个为真

        处理动作:
            -print:将符合条件的查找结果直接输出到标准输出;默认动作;
            -ls:将符合条件的查找结果以"ls -dils"命令的执行结果进行显示,也就是在最后加-ls就会显示出查找到的结果的详细信息;
            -exec command {} \;
            -ok command {} \;
                对于符合条件的查找结果按照"command"命令再执行一遍,{}为占位符,其含义是:用来引用find命令查找结果中的各个文件的路径信息;

                注意:
                    -exec是非交互式的;-ok是交互式的;
                    很多命令是不能放置与管道后面使用的;因为管道输送的是纯字符串信息,因此管道后面的命令一般来讲都必须是处理字符串的命令;如果管道之后放置的命令不能处理纯字符串,通常,可以使用xargs名将其转换成能够被管道后面的命令处理的参数;

                    示例:
                        # find -perm /222 | xargs chmod a+w

                        # chmod a+w $(find -perm /222)

                        # find -perm /222 { -exec|-ok } chmod a+w {} \;
                        查找当前系统上没有属主或属组,且最近一个月内曾被访问过的文件,并将其属主属组均修改为root;
                        find / ?nouser ?nogroup  -atime -1 -exec chown root:root {} \;

Linux任务调度:
在未来的某个时间点,让系统自动触发我们事先编写好的命令的列表或脚本的执行,从而实现即使用户不在计算机旁可以按时完成任务;

前提:
    1.时间的准确性;
    2.支持任务调度的应用程序;
        atd:在未来某个时间点执行一次计划任务;
        crond:在未来某个时间点周期性的执行已设定计划任务;

注意:在计划任务中所有执行的操作命令的输出结果,这类结果均以邮件的方式发送至指定用户的邮箱中;

本地的电子邮件服务:
    SMTP:简单邮件传输协议,TCP/25;

    mail [-s SUBJECT] USERNAME[@DOMAINNAME]

    /var/spool/mail目录中为每个系统用户都安放了邮箱;

atd任务调度进程,能够识别和完成有at命令及batch命令定制的计划任务;
    at命令:
        at [option] timespec

        timespec:
            1.HH:MM [YYYY-mm-dd]
            2.noon, midnight, teatime
            3.tomorrow
            4.now+#UNIT
                UNIT:minutes, hours, days, or weeks

        at定义的计划任务都在某个特定的任务队列之中;默认at只启用了一个任务队列,用字母"a"来标识;队列名称通常使用单个字母;

        at命令的常用用法:
            at [-q QUEUE_NAME] time:定义计划任务;在输入任务之后,Ctrl+d提交;

            atq或at -l
                查看所有的任务队列中的尚未执行的计划任务列表;

            atrm JOB_ID或at -d JOB_ID
                撤销任务队列中尚未执行的指定任务标识符的计划任务;

            at -f /PATH/TO/SOME_FILE time

            at -c JOB_ID:查看指定的计划任务的具体内容;

    batch命令:
        与at命令功能类似,都是一次性的定义计划任务;

        区别是,batch命令定义计划任务时,无需指定执行时间,而是由系统自动选择较空闲时间完成此任务;

crond任务调度进程:能够识别和周期性的执行crontab命令定制的计划任务;
    需要cronie程序包提供;通常在CentOS系统中会被默认安装;

    crontab定义的计划任务分为两类:
        系统任务:
            全局性任务;通常使用/etc/crontab文件中定义;
            /etc/crontab文件的通用格式:
                *    *      *  *  * user-name  command to be executed
              分钟    小时   天 月 星期

             注意:
                * * * * *:定义周期性执行计划任务的具体时间;
                user-name:运行后面命令的用户账户;
                command to be executed:此次计划任务的执行主体;为了保证任务能够正确执行,命令建议使用绝对路径;

        用户任务:
            个体性任务;通常会存放在/var/spool/crom/下与用户名对应的文件中;
            此类文件的格式:
                *    *      *    *   *     command to be executed
             分钟 小时   天    月  星期

        时间表示法:
            1.某个特定时间:给定的时间点的有效取值范围内的所有有效值;
                0 3 4 9 5
            2.通配符时间:"*",表示"每..."的意思;
            3.离散的时间点:
                0 8,20 * * 1,2,4,5
            4.连续的时间段:
                0-10 8-12 * * *
            5.步进时间:
                */3 * * * *

                */9 * * * *:无法真正实现每9分钟执行一次;因此默认情况下,步进长度应该是能够被60整除的数字;

            注意:最小的时间单位是分钟,如果计划使用不足一分钟的若干秒为执行周期,则必须借助于其他的机制,如:编写shell脚本;

用户周期性任务的定制:
    crontab命令:
        crontab - maintains crontab files for individual users

        crontab [-u user] file
        crontab [-u user] [-l | -r | -e] [-i]
            -u user:超级用户为自己或其他用户设置或编辑周期性任务时使用的选项;
            -l:查看所有的已经被定义好的计划任务列表;
            -e:使用vi编辑器编辑临时的crontab文件;
            -r:移除所有的计划任务;建议谨慎使用;
            -i:在使用-r选项时,能够进行交互式删除;

以上是关于find命令使用及Linux任务调度的主要内容,如果未能解决你的问题,请参考以下文章

Linux未来任务的调度——at,batch,crontab命令

find命令怎么使用

Linux的定时任务详解

求linux基本命令

linux系统任务调度命令crontab

Linux任务调度命令(轻松管理Linux)