條件判斷、文件查找與壓縮

一、條件判斷

1.條件選擇if語句
   選擇執行:
   注意:if語句可嵌套

(1).單分支
if 判斷條件:then
   條件為真的分支代碼
fi

(2).雙分支
if 判斷條件; then
   條件為真的分支代碼
else
   條件為假的分支代碼
fi

(3).多分支
if 判斷條件; then
    條件為真的分支代碼
elif 判斷條件; then
    條件為真的分支代碼
elif 判斷條件; then
    條件為真的分支代碼

else
    條件為假的分支代碼
fi

逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而后結束整個if語句

if實例
根據命令的退出狀態來執行命令
if ping -c 1 -W 2 station1 &> /dev/null;then
    echo 'Station1 is UP'
elif grep "station1" ~/maintenance.txt &> /dev/null;then
    echo 'Station1 is under going maintenance'
else echo 'Station1 is unexpectedly DOWN!' exit 1
fi

2.條件判斷:case語句

case 變量引用 in
PAT1)
    分支1
    ;;
PAT2)
    分支2
    ;;

*)
    默認分支
    ;;
esac

case支持glob風格的通配符:
*: 任意長度任意字符
?: 任意單個字符
[]:指定范圍內的任意單個字符
a|b: a或b

二、文件查找

在文件系統上查找符合條件的文件;
文件查找:locate, find
非實時查找(數據庫查找):locate
實時查找:find

1.locate
查詢系統上預建的文件索引數據庫:/var/lib/mlocate/mlocate.db

依賴于事先構建的索引;
索引的構建是在系統較為空閑時自動進行(周期性任務);管理員手動更新數據庫(updatedb);
索引構建過程需要遍歷整個根文件系統,極消耗資源;

工作特點:
查找速度快;
模糊查找;
非實時查找
搜索的是文件的全路徑,不僅僅是文件名
可能只搜索用戶具備讀取和執行權限的目錄

locate KEYWORD
選項
-i:執行區分大小寫的搜索
-n X:只列舉前X個匹配項目
-b:只匹配路徑中的基名
-c:統計符合條件的數量
-r "PATTERN":支持基礎正則表達式
例如:
搜索名稱或路徑中帶有“foo”的文件
locate foo
使用Regex來搜索以“.foo”結尾的文件
locate -r '\.foo$'

Image 001.png

Image 002.png

Image 003.png

2.find
實時查找工具,通過遍歷指定路徑完成文件查找;

工作特點:
查找速度略慢
精確查找
實時查找
可能只搜索用戶具備讀取和執行權限的目錄

find [OPTION]… [查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目標路徑;默認為當前目錄
查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件
處理動作:對符合條件的文件做操作,默認輸出至屏幕

查找條件

(1).根據文件名和inode查找:
-name "文件名稱":支持使用glob
*, ?, [], [^]
-iname "文件名稱":不區分字母大小寫
-inumn #:按inode號查找
-samefile name:相同inode號的文件
-links n :鏈接數為n的文件
-regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱

Image 004.png

Image 005.png

Image 006.png

(2).根據屬主、屬組查找:

-user USERNAME:查找屬主為指定用戶(UID)的文件
-group GRPNAME: 查找屬組為指定組(GID)的文件
-uidUserID:查找屬主為指定的UID號的文件
-gidGroupID:查找屬組為指定的GID號的文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件

Image 007.png

Image 009.png

Image 010.png

(3).根據文件類型查找:

-type TYPE:
f: 普通文件
d: 目錄文件
l: 符號鏈接文件
s:套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件

Image 010.png

(4).根據文件大小來查找:

-size [+|-] #
常用單位:k, M, G
# : (#-1, #],如:6k
-# :[0,#-1], 如:-6k
+# :(#,∞), 如:+6k
Image 011.png
(5).根據時間戳:
以“天”為單位;
-atime[+|-] #,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分鐘”為單位:
-amin
-mmin
-cmin
Image 012.png(6).根據權限查找:
-perm [/|-] MODE
MODE: 精確權限匹配
/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系,+ 從centos7開始淘汰
-MODE:每一類對象都必須同時擁有指定權限,與關系
0 表示不關注
find -perm 755會匹配權限模式恰好是755的文件
只要當任意人有寫權限時,find -perm +222就會匹配
只有當每個人都有寫權限時,find -perm -222才會匹配
只有當其它人(other)有寫權限時,find -perm -002才會匹配
Image 013.png組合條件:
與:-a
或:-o
非:-not, !
德·摩根定律:
非(P 且Q) = (非P) 或(非Q)
非(P 或Q) = (非P) 且(非Q)
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)

處理動作
-print:默認的處理動作,顯示至屏幕;
-ls:類似于對查找到的文件執行“ls -l”命令
-delete:刪除查找到的文件;
-flsfile:查找到的所有文件的長格式信息保存至指定文件中
-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令;對于每個文件執行命令之前,都會交互式要求用戶確認
-exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令
{}: 用于引用查找到的文件名稱自身
find傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令
有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題find | xargs COMMAND
排除目錄find /etc-path ‘/etc/sane.d’ -a -prune -o -name *.conf-print

find實例
搜索名為snow.png的文件
find -name snow.png

不分大小寫地搜索名為snow.png、Snow.png、SNOW.PNG等等的文件
find -iname snow.png
find / -name *.txt
find /var –name *log*
find-userjoe -groupjoe

搜索被用戶joe 以及組群joe所擁有的文件
find -user joe -not -group joe
find -user joe -o -user jane
find -not \( -user joe -o -user jane \)
find / -user joe -o -uid 500

找出/tmp目錄下,屬主不是root,且文件名不是fstab的文件
find /tmp \( -not -user root -a -not -name 'fstab' \) -ls
find /tmp -not \( -user root -o -name 'fstab' \) –ls

find實例
備份配置文件,添加.orig這個擴展名
find -name “*.conf” -exec cp {} {}.org \;
提示刪除存在時間超過3天以上的joe的臨時文件
find /tmp -ctime +3 -user joe -ok rm {} \;
在你的主目錄中尋找可被其它用戶寫入的文件
find ~ -perm -002 -exec chmodo -w {} \;
在/date目錄下查找權限為644并以.sh結尾的普通文件,將其權限設為755
find /data –type f -perm 644 -name *.sh –exec chmod 755 {} \;
查看/home下的目錄文件
find /home –type d -ls

3.Gnome搜索工具
位置->搜索文件……
圖形化搜索工具,可搜索
搜索條件:命令,內容,用戶/組群,大小,修改時間

三、壓縮與解壓縮及歸檔工具

1.compress/uncompress
  compress [-dfvcVr] [-b maxbits] [file …]
-d: 解壓縮,相當于
-c: 結果輸出至標準輸出,不刪除原文件
-v: 顯示詳情
uncompress解壓縮
zcat file.Z > file

2.gzip/gunzip
gzip[OPTION]… FILE …
-d: 解壓縮,相當于gunzip
-c: 將壓縮或解壓縮的結果輸出至標準輸出
-#:1-9,指定壓縮比,值越大壓縮比越大
zcat:不顯式解壓縮的前提下查看文本文件內容
實例:
gzip -c messages > messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages

3.bzip2/bunzip2/bzcat
bzip2 [OPTION]… FILE …
-k: keep, 保留原文件
-d:解壓縮
-#:1-9,壓縮比,默認為6
bzcat:不顯式解壓縮的前提下查看文本文件內容;

4.xz/unxz/xzcat
xz[OPTION]… FILE …
-k: keep, 保留原文件;
-d:解壓縮
-#:1-9,壓縮比,默認為6;
xzcat: 不顯視解壓縮的前提下查看文本文件內容;

5.zip/unzip
  zip –r sysconfigsysconfig/
  unzip sysconfig.zip
cat /var/log/messages | zip message –
unzip -p message > message

6.tar
  tar [OPTION]…
(1) 創建歸檔
tar -c -f /PATH/TO/SOMEFILE.tar FILE…
tar cf/PATH/TO/SOMEFILE.tar FILE…
(2) 查看歸檔文件中的文件列表
tar -t -f /PATH/TO/SOMEFILE.tar
(3) 展開歸檔
tar -x -f /PATH/TO/SOMEFILE.tar
tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/
結合壓縮工具實現:歸檔并壓縮
-j: bzip2, -z: gzip, -J: xz

7.cpio復制從或到文件
cpio命令是通過重定向的方式將文件進行打包備份,還原恢復的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件。
cpio[選項] > 文件名或者設備名
cpio[選項] < 文件名或者設備名
選項
-o 將文件拷貝打包成文件或者將文件輸出到設備上
-i 解包,將打包文件解壓或將設備上的備份還原到系統
-t 預覽,查看文件內容或者輸出到設備上的文件內容
-v 顯示打包過程中的文件名稱。
-d 解包生成目錄,在cpio還原時,自動的建立目錄
-c 一種較新的存儲方式

實例
將etc目錄備份:
find ./etc -print | cpio -ov > etc.cpio
內容預覽
cpio –tv < etc.cpio
解包文件
cpio –iv <etc.cpio
cpio –idv < etc.cpio

條件判斷
1、寫一個腳本/root/bin/createuser.sh,
     實現如下功能:使用一個用戶名做為參數,如果指定參數的用戶存在,就顯   示其存在,否則添加之;顯示添加的用戶的id號等信息
    

#!/bin/bash
     if id $1 &> /dev/null ;then 
         echo "user $1 exists" 
     else useradd $1 && id $1
     fi

2、寫一個腳本/root/bin/yesorno.sh,提示用戶輸入yes或no,并判斷用戶輸入的是yes還是no,或是其它信息
    

#!/bin/bash
     read -p "Please input a select (yes|no):" answer
     case $answer in
     [Yy]|[Yy][Ee][Ss])
         echo -e "Your select is \033[31myes\033[0m"
         ;;
     [Nn]|[Nn][Oo])
         echo -e "Your select is \033[31mno\033[0m"
         ;;
     *)
         echo -e "This is a not good answer"
     esac
     ##!/bin/bash
     #read -p "Please input a select (yes|no):" input
     #answer=`echo $input | tr "A-Z" "a-z"` 
     #case $answer in
     #yes)
     #    echo -e "Your select is \033[31myes\033[0m"
     #    ;;
     #no)
     #    echo -e "Your select is \033[31mno\033[0m"
     #    ;;
     #*)
     #     echo -e "This is a not good answer"
     #esac

3、寫一個腳本/root/bin/filetype.sh,判斷用戶輸入文件路徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)
   

  #!/bin/bash
     read -p "Please input a filename:" filename
     if test -e $filename;then
         if test -f $filename;then
             echo "regular file"
         elif test -d $filename;then
             echo "dirctory"
         elif test -h $filename;then
             echo "link"
         else
             echo "other"
         fi
    else 
        echo "$filename not exist"
    fi

4、寫一個腳本/root/bin/checkint.sh,判斷用戶輸入的參數是否為正整數
   

 #!/bin/bash
    if [[ $1 =~ ^0*[1-9][0-9]*$ ]];then
        echo "int"
    else
        echo "not int"
    fi
     
    ##!/bin/bash
    #if expr $1 + 0 &> /dev/null;then  
    #    echo "int"
    #else
    #    echo "not int"
    #fi

    
文件查找
1、查找/var目錄下屬主為root,且屬組為mail的所有文件
     find /var -user root -group mail
2、查找/var目錄下不屬于root、lp、gdm的所有文件
     find /var -not \( -user root -o -user lp -o -user gdm \)
3、查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件
     find /var -mtime -7 -not \( -user root -o -user postfix \)
4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件
     find / -nouser -o -nogroup -atime -7
5、查找/etc目錄下大于1M且類型為普通文件的所有文件
     find /etc -size +1M -type f
6、查找/etc目錄下所有用戶都沒有寫權限的文件
     find /etc -not -perm +222
7、查找/etc目錄下至少有一類用戶沒有執行權限的文件
     find /etc -not -perm -111
8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件
     find /etc/init.d -perm -113

原創文章,作者:anonymous,如若轉載,請注明出處:http://www.www58058.com/35785

(0)
anonymousanonymous
上一篇 2016-08-15
下一篇 2016-08-15

相關推薦

  • 6個用于大數據分析的最好工具

    大數據是一個含義廣泛的術語,是指數據集,如此龐大而復雜的,他們需要專門設計的硬件和軟件工具進行處理。該數據集通常是萬億或EB的大小。這些數據集收集自各種各樣的來源:傳感器,氣候信息,公開的信息,如雜志,報紙,文章。大數據產生的其他例子包括購買交易記錄,網絡日志,病歷,軍事監控,視頻和圖像檔案,及大型電子商務。  在大數據和大數據分析,他們對企業的影…

    Linux干貨 2015-04-04
  • 馬哥教育網絡班21期+第六周課程練習

    第六周作業 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; cp /etc/rc.d/rc.sysinit /tmpvim /tmp/rc.sysinit # 命令模式下,輸入一下內容:%s@\(^[[:space:]]…

    Linux干貨 2016-10-17
  • 網絡知識及寫腳本,一個又一個

    1、請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。 集線器是屬于物理層的設備,可以理解為一根網線中間串接出了多個接口,這么多接口共享這一根網線的帶寬, 因此這些接口上的設備在使得網絡時就會出現沖突,或者‘道路’擠占的情況。(所有的設備在一個廣播域,沖突域中),集線器現在很少使用了。 交換機、網橋都是數據鏈路層的設備,網橋的出現就是…

    2017-02-10
  • bash編程基礎(二)補

       bash腳本編程         腳本文件格式:         第一行,頂格:#!/bin/bash         注釋信息:#         代碼注釋:  …

    Linux干貨 2016-12-23
  • Linux系統操作練習-2

    1、顯示當前系統上root、fedora或user1用戶的默認shell: 2、找出/etc/rc.d/init.d/functions文件中某單詞后面跟一組小括號的行,形如:hello(): 3、使用echo命令輸出一個絕對路徑,使用grep取出基名;擴展:取出路徑名: 擴展: 4、找出ifconfig命令結果中的1-255之間的數字: 5、挑戰題:寫一個…

    2017-11-25
  • LNMP的虛擬主機配置http和https

    項目實戰:    搭建LNMP環境:Linux+Nginx+Mysql(MariaDB)+php(php-fpm),創建多個虛擬主機:    主機1提供正常的http服務,用于安裝wordpress博客;    主機2提供正常的https服…

    Linux干貨 2016-10-30

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-19 09:17

    總結的很詳細,腳本那就是需要多謝多練,find命令對我們來說很重要的,也是個很有用的工具,所以需要好好練習哦

欧美性久久久久