Linux学习日志(九)

文件查找: find命令

grep : 文本搜索
find :文本查找

locate:(updatedb 手动生产)

  1.依赖于数据库
  2.非实时查找,结果非精确
  3.查找速度快
  4.采用的模糊查找  

find:

   实时查找:速度慢
   精确匹配 

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

     查找路径:默认为当前目录
     查找条件:默认为查找指定路径下的所有文件
     处理动作:默认为显示

查找条件:

   -name “文件名称”:支持使用globbing(文件通配)

  -iname "文件名称" : 根据姓名查找文件,不区分大小写   
  -user UserName :根据属主查找 
  -group GroupName : 根据属组查找
  -nouser:查找没有属主的文件
  -nogroup: 查找没有属组的文件            
  -type: 根据文件类型查找
     f: 普通文件
     d: 目录
     b: 块设备
     c: 字符设备
     l: 符号链接文件
     p: 命令管道
     s: 套节子

   -szie:根据文件大小查找
      格式: -size[+|-]#Unit 
            #:(#-1)

根据时间撮查找:

  以天为单位(time):
      -atime [+|-]#
      -mtime          
      -ctime

    -: 刚好#
    +: >#

  以分钟为单位

      -amin
      -mmin
      -cmin

根据权限查找:

   -perm [+|-] MODE 
         MODE : 精确匹配
         + MODE:任何一类用户的任何一位权限匹配 (常用于查找某类的某特定权限是否存在)

         - MODE:每类用户的指定要检查的权限位都匹配

文件通配:

     *:表示任意长度的任意字符
     ?:表示任意的单个字符
     [] : 表示在指定范围内的单个字符:[a-z]
     [^]:脱字符,取反的意思

组合条件:

  -a :与。同事满足
  -o : 或,一个满足
  -not , !非。取反

练习:

1.查找/var目录中属主为root且属组为mail的文件

 find /var/ -user root -group mail

2.查找/usr目录下不属于root、bin或 hadoop的所有文件

 find /usr/ -not -user root -not -user bin -not -user hadoop
 find /usr/ -not \( -user root -o -user bin -o -user hadoop \)

3.查找/etc目录中最近一周内其内容修改过的,且不属于root或hadooop的文件

find /etc -mtime -7 -not -user root -not -user hadoop

4.查找当前系统上没有属组或属组,且最近一个月内被访问过的文件

 find / \(-nouser -o -nogroup\) -atime -30

5.查找早/etc/目录下大于1M且类型为普通文件的所有文件

 find /etc/ -type f -size +1M

6.查找/etc/目录所有用户都没有写权限的文件

       find /etc/ -not -perm +222
       所有都没有;相反:任何一个有
       所有都有:相反:只要有一个没有

7.查找/etc/目录下至少一类没有写权限的文件

 find /etc/ -perm -222

8.查找/etc/init.d目录下,所有用户都有执行权限其其他用户有写权限的文件

find /etc/init.d/  -perm -111 -perm -002
find /etc/init.d/  -perm -113     

Linux任务计划

一次性任务执行:

at:

1.交互式 让用户在at>提示符输入多个要执行命令

  格式:at time
       atq =at -L 查看作业
       -q 字母 TIme  添加别的队列
       at -d job_name 删除一个尚未执行的作业= atrm

    Ctrl+d :提价任务
    at 作业有队列:使用单个字符表示


2.批处理:将任务的各命令写入文件由at进行调用

 at批模式:
    at -f 文件路径 TIME 

 TIME:
     模糊时间:
       now
       noon(中午) 
       midnight(午夜)
       teatime(下午4点)    
       tomorrow

任务的执行结果会议邮件的形式发送给提交者

使用mail

-s 指定主题
   mail -s 主题 用户

  mail 用户名 
      主题
      内容   

 可以通过系统文件当作内容 或者用ehco   

      echo -e "hello are you " | mail -s "to" root
      cat /etc/passwd | mail -s "ss" root

batch:不能指定时间,它自动选择系统空闲时执行

  crond:守护进程,运行在后台,随时监视着进程等待执行
  服务进程:阻塞,轮训

周期性任务执行

系统cron:

   文件: /etc/crontab          
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    HOME=/

        # For details see man 4 crontabs
        # Example of job definition:
        # .---------------- minute (0 - 59)
        # |  .------------- hour (0 - 23)
        # |  |  .---------- day of month (1 - 31)
        # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
        # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
        # |  |  |  |  |
        # *  *  *  *  * user-name command to be executed

时间表示法:

1.每个时间位都应该使用其可用的有效取值范围内的值
2.某时间位上的*表示对应位的所有有效取值
3. -:连续的相邻时间点取值
4. ,:离散的时间点取值
5. /# :表示在指定时间范围内每隔#一次   5-45/3 5到45分钟,每3分钟执行一次

注意: 通过输出重定向而拒收邮件

 &> /dev/null  错误
 > /dev/null 2>/文件位置 成功的到/dev/null 成功到指定位置

用户cron:

   文件: /var/spool/sron/UserName

使用crontab命令来实现

     -l:查看自己的cron任务列表
     -e:通过EDITOR变量中定义的编辑器打开用户自己的cron配置文件:
     编辑单独的任务都使用-e选项,无论是删除、修改还是新建
     -r:移除crontab文件       

如果是管理员

  -u UserName: 为别的用户指定crontab作业
     #crontab -e -u 用户名

提醒:如果在conrtab的用户命令中使用%,得转义为\%

anacron

练习

1、每3分钟执行一个“echo “how are you?””

    */3 * * * * /bin/echo "hao are you" 

2、每周2、4、6备份/etc/目录至/backup目录中,备份的文件名以当etc_开头并跟上当日的日期作为文件名

3 2 * * 2,4,6 /bin/tar  -Jcf /backup/etc_`data '+/%F'.tar.xz ` /etc/*           

3.每天6,9,12,15,18查看一下系统当前挂载的所有文件系统,并将查看的结果追加至/tmp/mounts.txt文件中

  3 6,9,12,15,18 * * * * * /bin/mount>>/tmp/mounts.txt

4.每天每两小时取当前系统内存空间余量,将其保存至/stats/memory.txt文件中

 34 */2 * * * /bin/grep "^MemFree:" /proc/meminfo >> /status/memory.txt

如何实现秒级别的任务

  * * * * * * /bin/echo "how are your"; sleep 30; /bin/echo "how are you"

crontab文件的格式

  空白行会被忽略
  #开头的行是注释

anacron:

 1. 是crontab的补充,用于检查crontab中某任务在过去的一个周期内是否没有执行,
 2. 如果没有执行,则在开机以后的某时间点让其执行一次,无论其周期是否到达

facl:文件访问控制列表

普通用户无法安全地将某文件授权给其他用户访问

facl:

 附加原有权限模型之上另一层权限控制机制,保存至文件扩展属性信息中   

命令:

 getfacel file...
 setfacel {-x|-m} 权限 file...


  -m:设定权限
     -m u:UserName:Perms
     -m g:GroupName:Perms
     -m m::Perms
  -x:取消权限
     -x u:UserName
     -x g:GroupName
     -x m:
  ll表示为+,有额外的权限属性
  -R:递归,对文件夹内的文件也生效

bash编程之循环控制

for varName in List; do 
     循环体
done

while CONDITION; do 
    循环体
done

循环控制

    continue:提前结束本次循环而开始评估下一轮
    break [n]:结束当前循环,指定条吹几次循环

shell练习

练习:求100以内所有偶数之和

#!/bin/bash 
 declare -i sum=0
 declare -i i=1

 while [ $i -le 100 ];do
    if [ [ $i%2 ] -eq 0 ];then
       let sum+=$i
    fi
    let i++
  done

写一个脚本
1.让用户输入一个块设备,如果设备文件不存在,就提示用户重新输入,知道用户输入正确

2.用户可以输入quit退出

#!/bin/bash
#
 while true; do
   read -p "Enter a dev " devdir
   if [ "$devdir" == "quit" ];then
        break
  fi
  if [ -b $devdir ];then
      break
 else
     echo "wrong device file"
 fi
done

扩展前一题
1,显示用户输入块设备,并提示用户,后续操作会损坏设备上的所有文件,让用户选择是否选择
2.如果用户输入y。则继续后面的操作
3.如果用户输入n ,则显示用户选择了终止,并退出脚本
4.输入任何其他字符,则用户重新选择

       #!/bin/bash
       #
       while true; do
          read -p "Enter a dev " devdir

          if [ "$devdir" == "quit" ];then
                break
          fi

         if [ -b $devdir ];then
           echo "$devdir is very good !"
             read -p "Are you suer [y|b]" devop
              devop=echo $devop | tr 'A-Z' 'a-z'
               if [[ "$devop" == "y"  ]];then
                  echo "no xuanze le yes"
          elif [[ "$devop" == "n"  ]];then
                   break
               else
                    continue
               fi
           else
             echo "wrong device file"
             fi
            done

练习:写一个脚本
1.提示用户输入一个目录路径
2,显示目录下至少包含一个大写字母的文件名

 #!/bin/bash
while true;do
    read -p "Enter a directory: " dirname
    [ "$dirname" == "quit" ] && exit 3
    [ -d "$dirname" ] && break || echo "wrong directory..."
done
 for filename in $dirname/*;do
         if [[ "$fileName" =~ .*[[:upper:]]{1,}.* ]]; then
                echo "$fileName"
        fi
done

练习:写一个脚本
前提:配置好yum源
1、如果本机没有一个可用的yum源,则提示用户,并退出脚本(4);如果此脚本非以root用户执行,则显示仅有root才有权限安装程序包,而后退出(3);
2、提示用户输入一个程序包名称,而后使用yum自动安装之;尽可能不输出yum命令执行中的信息;
如果安装成功,则绿色显示,否则,红色显示失败;
3、如果用户输入的程序包不存在,则显示错误后让用户继续输入;
4、如果用户输入quit,则正常退出(0);
5、正常退出前,显示本地共安装的程序包的个数;

#!/bin/bash
while true;do
if [ $UID -ne 0 ]; then
    echo "`basename $0` must be running as root"
    exit 3
fi
yum repolist &> /dev/null
if  [[ $? -eq 0 ]];then
   while true;do
   read -p "Enter a chengxubao: " baoname
     if [[ "$baoname" == "quit" ]];then
      rpm -qa |wc -l
       exit 0
     fi
   yum list |grep "^$baoname.*" &> /dev/null
     if [[ $? -eq 0 ]];then
      yum install $baoname -y &> /dev/null
        if [[ $? -ne 0 ]];then
         echo "$baoname not ok"
        else
        echo "$baoname is ok!"
          exit 0
        fi
    else 
         continue
    fi
  done 
  else 
     echo "yum is not ok!!"
  exit 4
fi
done

你可能感兴趣的:(Linux学习日志)