歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

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
Copyright © Linux教程網 All Rights Reserved