当前位置: 亚洲城ca88 > 亚洲城 > 正文

Shell脚本自动删除指定大小以上的备份文件,Sh

时间:2019-05-18 03:13来源:亚洲城
不久前本地虚拟机的空中年老年是被备份给占满,为了偷懒不想和谐时刻登6上去清除,才写了这几个活动清理脚本. 复制代码 代码如下: 十玖、将文件的输出格式化为内定的增长幅度: 系

不久前本地虚拟机的空中年老年是被备份给占满,为了偷懒不想和谐时刻登6上去清除,才写了这几个活动清理脚本.

复制代码 代码如下:

十玖、将文件的输出格式化为内定的增长幅度:

系统:centos 5.x

#!/bin/bash
#Description: delete files
#=====定义当二零1七年度,月份以及文件所在目录=====#
currentYear=`date %Y`                                       
currentMonth=`date  %m |awk -F'0' '{print $2}'`  
videodir=/var/video                                                   
#======定义1个转移函数,用于将月份缩写调换为数字代表========#
function month2num(){
case $file_month in
Jan)
file_month=1
;;
Feb)
file_month=2
;;
Mar)
file_month=3
;;
Apr)
file_month=4
;;
May)
亚洲城,file_month=5
;;
Jun)
file_month=6
;;
Jul)
file_month=7
;;
Aug)
file_month=8
;;
Sep)
file_month=9
;;
Oct)
file_month=10
;;
Nov)
file_month=11
;;
Dec)
file_month=12
;;
*)
echo "Oh,Are you kidding me?!"
exit 1
;;
esac
}
#=====定义二零一九年年度以及后年的具备文件列表=====#
lastYear=$[$currentYear-1]                                                                  
lastYearFiles=`/bin/ls -l $videodir/ |grep $lastYear |awk -F' ' '{print $9}'`
#===== 删除下一季度的公文,后日为201三年七月,则删除2012年1月事先的有所文件(一-1月)=====#
for lastfile in `echo $lastYearFiles`                                   
do
file_month=`/bin/ls -l $videodir/$lastfile  |awk  -F' ' '{print $6}'`
month2num
if [ $file_month -lt $currentMonth ]
then
rm -rf $videodir/$lastfile
fi
done
#=====删除非下半年以及非今年的兼具文件=====#
otherYearFiles=`/bin/ls -l $videodir/ |grep -v $lastYear |awk -F' ' '{print $9}'`
for otherfile in `echo $otherYearFiles`
do
file_year_format=`/bin/ls -l $videodir/$otherfile  |awk  -F' ' '{print $8}'|wc -c`
if [ $file_year_format -eq 5 ]
then
rm -rf $videodir/$otherfile
fi
done

      在这一个本事中,不止富含了怎么样收获和文书有关的详细新闻,如行数,字符等,而且还是能够让文件遵照内定的宽窄输出。这种应用在出口援救新闻、License相关音讯时依然相比有效的。
      /> cat > test19.sh
      #!/bin/sh
      #一. 那边我们将缺省宽度设置为75,假使凌驾该增进率,将想念折行呈现,不然直接在一行中全体打字与印刷输出。这里只是为着演示方便,事实上,你一点1滴能够将该值作为脚本或函数的参数字传送入,那样你将会收获越来越高的百发百中。    
      my_width=75
      #二. for循环的读取列表来自于脚本的参数。
      #3. 在获得lines和chars变量时,sed命令用于过滤掉多余的空格字符。
      #4. 在if的规格推断中${#line}用于获取line变量的字符长度,那是Shell内置的条条框框。
      #五. fmt -w 80命令会将echo输出的整行数据根据其命令选项钦赐的宽度(八十个字符)举办折行展现,再将折行后的多少以多行的花样传递给sed命令。
      #陆. sed在收到fmt命令的格式化输出后,将会在折行后的率先行尾部增多多个空格,在别的行的头顶加多一个加号和八个空格以表示差异。
      for input; do
          lines=`wc -l < $input | sed 's/ //g'`
          chars=`wc -c < $input | sed 's/ //g'`
          owner=`ls -l $input | awk '{print $3}'`
          echo "-------------------------------------------------------------------------------"
          echo "File $input ($lines lines, $chars characters, owned by $owner):"
          echo "-------------------------------------------------------------------------------"
          while read line; do
              if [ ${#line} -gt $my_width ]; then
                  echo "$line" | fmt -w 80 | sed -e '1s/^/  /' -e '2,$s/^/ /'
              else
                  echo "  $line"
              fi
          done < $input
          echo "-------------------------------------------------------------------------------"
      done | more
      CTRL D
      /> ./test19.sh testfile

本子内容:

您大概感兴趣的篇章:

  • PowerShell中删除空格、点号、减号和换行方法代码实例
  • PowerShell查询和删除打字与印刷职责操作代码实例
  • Shell脚本达成删除邮件队列
  • Shell脚本达成递归删除空文件夹
  • Shell脚本自动删除钦命大小以上的备份文件
  • shell达成tr删除替换详解
  • 行使bash shell删除目录中的特定文件的叁种艺术
  • Shell中什么删除文本比较长的行的兑现格局

     

      File testfile.dat (3 lines, 645 characters, owned by root):

cat make_room.sh

     

         The PostgreSQL Global Development Group today released updates for all
      active branches of the PostgreSQL object-relational database system,
      including versions 9.1.2, 9.0.6, 8.4.10, 8.3.17 and 8.2.23. Users of any of
      the several affected features in this release, including binary replication,
      should update their PostgreSQL installations as soon as possible.
         This is also the last update for PostgreSQL 8.2, which is now End-Of-Life
      (EOL). Users of version 8.2 should plan to upgrade their PostgreSQL
      installations to 8.3 or later within the next couple of months. For more
      information, see our Release Support Policy.
         This is just a test file.

复制代码 代码如下:

     

       
二十、监察和控制钦赐目录下磁盘使用空间过大的用户:

      在将Linux用作文件服务器时,全部的注册用户都得以在投机的主目录下存放各系列型和大小的文件。有的时候,某个用户的占有空间也许会明确抢先其旁人,那时就须要管理员能够及时开掘那一非常使用情形,并基于真实境况作出应对管理。
      /> cat > test20.sh
      #!/bin/sh
      #壹. 该脚本仅用于演示1种处理能力,当中不少阈值都以能够透过脚本参来伊始化的,如limited_qutoa和dirs等变量。
      limited_quota=200
      dirs="/home /usr /var"
      #二. 以冒号作为分隔符,截取passwd文件的率先和第3字段,然后将出口传递给awk命令。
      #3. awk中的$二表示的是uid,当中1-99是系统一保险留用户,>=十0的uid才是大家温馨创制的用户,awk通过print输出全体的用户名给for循环。
      #4. 注意echo命令的出口是由七个单词构成,同时由于-n选项,echo命令并不出口换行符。
      #5. 因而采用find命令,也是为了思量以点(DOT)发轫的隐身文件。这里的find将要钦命目录列表内,寻找钦赐用户的,类型为日常文书的文本。并透过-ls选项输出找到文件的详细音信。在那之中出口的详细消息的第10列为文件大小列。
      #陆. 透过awk命令累加find输出的第十列,最后再在大团结的END块大校sum的值用MB总括并出口。该命令的输出将会与地点echo命令的出口合并作为for循环的出口传递给末端的awk命令。这里要求提出的是,该awk的出口正是背后awk命令的$玖,因为echo仅仅输出的几个单词。
      #7. 从for循环管道获取数据的awk命令,由于awk命令施行的动作是用双引号括起的,所以表示域字段的变量的前缀$符号,需求用进展转义。变量$limited_quota变量将会活动完毕命令替换,从而构成该awk命令的末尾动作参数。
      for name in `cut -d: -f1,3 /etc/passwd | awk -F: '$2 > 99 {print $1}'`
      do
          echo -n "User $name exceeds disk quota. Disk Usage is: "
          find $dirs -user $name -type f -ls |
                awk '{ sum = $7 } END { print sum / (10241024) " MB" }'       done | awk "$9 > $limited_quota { print $0 }"
      CTRL D
      /> ./test20.sh    *

二拾1、编写2个更具可读性的df命令输出脚本:

      这里大家将以awk脚本的法门来兑现df -h的功力。
      /> cat > test21.sh
      #!/bin/sh
      #1. $$表示近期Shell进度的pid。    
      #2. trap时域信号捕捉是为着保险在Shell符合规律或极其退出时,照旧可以将该脚本成立的有的时候awk脚本文件删除。
      awk_script_file="/tmp/scf_tmp.$$"
      trap "rm -f $awk_script_file" EXIT
      #3. 第贰须求验证的是,'EOF'中的单引号特别关键,假使大意她将不可能通过编写翻译,那是因为awk的命令动作须求求用单引号扩住。
      #4. awk脚本的show函数中,int(mb 拾0) / 十0那几个技巧是为着确认保证输出时保留小数点后两位。       cat << 'EOF' > $awk_script_file       function show(size) {           mb = size / 1024;           int_mb = (int(mb * 100)) / 100;           gb = mb / 1024;           int_gb = (int(gb * 100)) / 100;           if (substr(size,1,1) !~ "[0-9]" || substr(size,2,1) !~ "[0-9]") {               return size;           } else if (mb < 1) {               return size "K";           } else if (gb < 1) {               return int_mb "M";           } else {               return int_gb "G";           }       }       #5. 在BEGIN块中打字与印刷重定义的输出头音信。       BEGIN {             printf "%-20s %7s %7s %7s %8s %sn","FileSystem","Size","Used","Avail","Use%","Mounted"       }       #6. !/Filesystem/ 表示过滤掉包蕴Filesystem的行,即df输出的第2行。其他行中,有个域字段能够一直动用df的输出,有的需求通过show函数的揣摸,以获得更为可读的体现结果。       !/Filesystem/ {           size = show($2);           used = show($3);           avail = show($4);           printf "%-20s %7s %7s %7s %8s %sn",$1,size,used,avail,$5,$6       }       EOF       df -k | awk -f $awk_script_file
      CTRL D
      /> ./test12.sh*
      FileSystem              Size       Used      Avail     Use%   Mounted
      /dev/sda2              3.84G    2.28G     1.36G      63%   /
      tmpfs                 503.57M     100K 503.47M        1%   /dev/shm
      /dev/sda1             48.41M  35.27M  10.63M      77%   /boot
      /dev/sda3              14.8G 171.47M  13.88G        2%   /home
   
二拾二、编写三个用以加多新用户的本子:

      之所以在此地选取这几个本子,没有越来越多的用意,只是感到这里的有一点才具和常识依旧须要理解的,如/etc/passwd、/etc/shadow、/etc/group的文件格式等。
      /> cat > test22.sh
      #!/bin/sh
      #一. 起始化和用户增进相关的变量。    
      passwd_file="/etc/passwd"
      shadow_file="/etc/shadow"
      group_file="/etc/group"
      home_root_dir="/home"
      #贰. 唯有root用户能够实行该脚本。    
      if [ "$(whoami)" != "root" ]; then
          echo "Error: You must be roor to run this command." >&2
          exit 1
      fi
    
      echo "Add new user account to $(hostname)"
      echo -n "login: "
      read login
      #3. 去唯壹uid,即日前最大uid值加一。
      uid=`awk -F: '{ if (big < $3 && $3 < 5000) big = $3 } END {print big 1}' $passwd_file`
      #肆. 设定新用户的主目录变量
      home_dir=$home_root_dir/$login
      gid=$uid
      #伍. 提醒输入和开立异用户相关的新闻,如用户全名和主Shell。
      echo -n "full name: "
      read fullname
      echo -n "shell: "
      read shell
      #陆. 将输入的消息填充到passwd、group和shadow四个至关心珍视要文件中。
      echo "Setting up account $login for $fullname..."
      echo ${login}:x:${uid}:${gid}:${fullname}:${home_dir}:$shell >> $passwd_file
      echo ${login}::11647:0:99999:7::: >> $shadow_file       echo "${login}:x:${gid}:$login" >> $group_file       #7. 创制主目录,同时将新用户的profile模板拷贝到新用户的主目录内。       #八. 设定该主目录的权柄,再将其下有所文件的owner和group设置为新用户。       #玖. 为新用户设定密码。       mkdir $home_dir       cp -R /etc/skel/.[a-zA-Z]* $home_dir       chmod 755 $home_dir       find $home_dir -print | xargs chown ${login}:${login}       passwd $login       exit 0
      CTRL D
      /> ./test22.sh*
      Add new user account to bogon
      login: stephen
      full name: Stephen Liu
      shell: /bin/shell
      Setting up account stephen for Stephen Liu...
      Changing password for user stephen.
      New password:
      Retype new password:
      passwd: all authentication tokens updated successfully.
   
二十叁、kill钦赐用户或内定终端的用户进程:

      那是1台运转Oracle数据库的Linux服务器,以往大家供给对Oracle做一些特殊的优化专门的学业,由于形成此项工作须要成本更多的系统能源,由此大家只能杀掉一部分其余用户正在运作的进度,以便节省出更加的多的系统能源,让此番优化办事能够尽快完毕。
      /> cat > test23.sh
      #!/bin/sh
      user=""
      tty=""
      #一. 通过读取脚本的授命行选项得到要kill的用户或终点。-t前边的参数表示终端,-u后边的参数表示用户。那五个接纳无法同时选拔。
      #二. case中的代码对剧本选项实行认证,1旦战败则脱离脚本。
      while getopts u:t: opt; do
          case $opt in
          u) if [ "$tty" != "" ]; then
                 echo "-u and -t can not be set at one time."
                 exit 1
              fi
              user=$OPTARG
              ;;
          t)  if [ "$user" != "" ]; then
                 echo "-u and -t can not be set at one time."
                 exit 1
              fi
              tty=$OPTARG
              ;;
          ?) echo "Usage: $0 [-u user|-t tty]" >&2
              exit 1
          esac
      done
      #三. 壹旦当前接纳的是根据终端kill,就用$tty来过滤ps命令的输出,否则就用$user来过滤ps命令的出口。
      #4. awk命令将独自打字与印刷出pid字段,之后传递给sed命令,sed命令删除ps命令输出的头音信,仅保留后边的长河pids作为出口,并初步化pids数组。
      if [ ! -z "$tty" ]; then
          pids=$(ps cu -t $tty | awk "{print $2}" | sed '1d')
      else
          pids=$(ps cu -U $user | awk "{print $2}" | sed '1d')
      fi
      #五. 判断数组是还是不是为空,空则意味着尚未符合供给的长河,间接退出脚本。
      if [ -z "$pids" ]; then
          echo "No processes matches."
          exit 1
      fi
      #陆. 遍历pids数组,每个kill钦定的历程。
      for pid in $pids; do
          echo "Killing process[pid = $pid]... ..."
          kill -9 $pid
      done
      exit 0
      CTRL D
      /> ./test23.sh -t pts/1
      Killing process[pid = 11875]... ...
      Killing process[pid = 11894]... ...
      /> ./test23.sh -u stephen
      Killing process[pid = 11910]... ...
      Killing process[pid = 11923]... ...
       
二拾四、推断用户输入(是/否)的省事措施:

      对于有个别交互式程序,常常必要拭目以俟用户的输入,以便显明下一步的实践流程。平日来讲,当用户输入"Y/y/Yes/yes"时表示断定当前的作为,而当输入"N/n/No/no"时则意味否认当前的行事。基于这种规则,大家得以兑现2个方便确认办法,即只决断输入的首字母,借使为Y或y,表示料定,如为N或n,则为否定。
      /> cat > test24.sh
      #!/bin/sh
      echo -n "Please type[y/n/yes/no]: "
      read input
      #一. 先转移小写到大写,再经过cut截取第二个字符。
      ret=`echo $input | tr '[a-z]' '[A-Z]' | cut -c1`
    
      if [ $ret = "Y" ]; then
          echo "Your input is Y."
      elif [ $ret = "N" ]; then
          echo "Your input is N."
      else
          echo "Your input is error."
      fi
      CTRL D
      /> ./test24.sh
      Please type[y/n/yes/no]: y
      Your input is Y.
      /> ./test24.sh
      Please type[y/n/yes/no]: n
      Your input is N.  

#!/bin/bash
#size=`df -hP|grep /dev/mapper/VolGroup00-LogVol00|awk '{print $4}'|cut -f 1 -d "G"`
size=`df -mP|grep /dev/mapper/VolGroup00-LogVol00|awk '{print $4}'`
file="/root/sqlbak"
if [ "${size}" -le "1000" ];then
rm -f ${file}/*
else
echo "$size"
fi

何以不用df -hP,因为if判别的时候老是报错,让自个儿放任了数字中会现身小数点的论断方式,直接用兆来判断那样更标准些.当然各位也能够加上其它的清理空间的主意,举个例子删除硬盘中过量50-100M的文本,恐怕去除前5-十二个大的公文,那些判定就靠各位本身去写了,这么些判断最佳不要影响到服务器系统牢固性.

您或者感兴趣的篇章:

  • 自动化下载并检验ftp文件备份的shell脚本
  • CentOS中选择Shell脚本达成每一天活动备份网站文件和数据库并上传到FTP中
  • 二个备份系统文件并邮件发送的Shell脚本分享
  • shell备份文件、重命名文件、删除钦点文件的一个剧本分享
  • shell编制程序跨过服务器务器备份文件

编辑:亚洲城 本文来源:Shell脚本自动删除指定大小以上的备份文件,Sh

关键词: 亚洲城ca88