8.15_Linux之bash shell腳本編程入門篇(二)以及文件查找和壓縮的使用

bash shell腳本編程入門篇(二)


read命令的使用


作用:

    使用read來把輸入值分配給一個或多個shell變量:

        -p指定要顯示的提示

        -t TIMEOUT

read從標準輸入中讀取值,給每個單詞分配一個變量,所有剩餘單詞都被分配給最後一個變量

EX.read -p “Enter a filename:“ FILE

wKioL1eyalqDO5JHAAApqCKyfgg334.png


條件選擇之if的使用


if的作用:選擇執行(注意:if語句可嵌套)


單分支

    if 判斷條件;then

        條件爲真的分支代碼

    fi


EX.單分支案例

wKiom1eycfnCQ_PFAABVtXKHJUE735.png


雙分支

    if 判斷條件; then

        條件爲真的分支代碼

    else

        條件爲假的分支代碼

    fi

EX.雙分支並嵌套if語句的例子

wKioL1eycqnCFYPNAAChcn-i2_Q623.png

多分支

    if 判斷條件1; then

        if-true

    elif 判斷條件2; then

        if-ture

    elif 判斷條件3; then

        if-ture

    ...

    else

        all-false

    fi

EX.多分支案例

wKioL1eyfCyhURT4AABbTZ-5Kqo387.png

總結:if的使用,是逐條件進行判斷,第一次遇爲“真”條件時,執行其分支,而後結束整個if語句


條件選擇之case的使用


case語句語法格式:

case 表達式 in 

    模式1)

        條件1

     ;;

    模式2)

        條件2

     ;;

    模式n)

        條件n

     ;;

    *)

        剩餘條件

    ;;

 esac


case中各模式可以使用glob匹配模式:

    a|b:a或者b

    *:匹配任意長度的任意字符

    ?:匹配任意單個字符

    [ ]:範圍匹配



EX.case的使用案例

wKiom1eyfqjzhCKUAABKq6TQOXY172.png


文件查找的使用


文件查找作用:在文件系統上查找符合條件的文件;

文件查找相關命令:locate, find

    非實時查找(數據庫查找):locate

    實時查找:find



locate命令的使用


1.locate命令特點:


(1)查詢系統上預建的文件索引數據庫

    /var/lib/mlocate/mlocate.db

(2)依賴於事先構建的索引

(3)索引的構建是在系統較爲空閒時自動進行(週期性任務),管理員手動更新數據庫(updatedb)

(4)索引構建過程需要遍歷整個根文件系統,極消耗系統IO資源

(5)工作特點:

    查找速度快

    模糊查找

    非實時查找

    搜索的是文件的全路徑,不僅僅是文件名

    可能只搜索用戶具備讀取和執行權限的目錄


2.locate相關命令:


locate KEYWORD


(1)選項:

    -i 執行區分大小寫的搜索

    -n N只列舉前N個匹配項目

    -r 支持使用正則表達式

(2)模糊搜索

    locate "png" ;搜索含有jpg字眼的文件

(3)支持正則表達式

    locate -r '\.png$' 使用regex來搜索以.jpg結尾的文件


EX.使用locate搜索以.png結尾的文件,不區分png的大小寫,且只顯示前10行搜索出來的內容。

wKioL1eygq3ReA3LAABwojYXXE0283.png

EX.由於locate搜索的內容依賴於/var/lib/mlocate/mlocate.db裏面的內容,所以如果數據塊裏面沒有這個內容的話就搜索不到這個內容了。甚至有時候有些數據塊裏面有的內容也搜不出來。

wKiom1eyhBDyaFO7AABDpOS97P4203.png

小總結:在生產環境中,如果使用locate命令搜索不到的想要內容,也不要用updatedb命令更新數據庫,因爲可能要更新的數據有很多,這樣的話會造成系統會產生大量的IO,會造成系統嚴重卡頓。


find命令的使用


1.find命令的特點:

(1)實時查找工具,通過遍歷指定路徑完成文件查找;(普通用戶需要注意權限問題)

(2)查找速度略慢

(3)精確查找

(4)可能只搜索用戶具備讀取和執行權限的目錄


2.find命令的語法:

find [OPTION]... [查找路徑] [查找條件] [處理動作]

    查找路徑:指定具體目標路徑;默認爲當前目錄

    查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認爲找出指定路徑下的所有文件

    處理動作:對符合條件的文件做操作,默認輸出至屏幕


3.find命令的查找條件

(1)根據文件名和inode查找:

    -name "文件名稱":支持使用glob

    *, ?, [], [^]

    -iname"文件名稱":不區分字母大小寫

    -inumn 按inode號查找

    -samefilename 相同inode號的文件

    -links n 鏈接數爲n的文件

    -regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱


EX.直接匹配目錄下面的以s開頭,以.sh結尾的文件

wKioL1eyuaHQaEX8AAAiQvB9mNg375.png

EX.匹配目錄下面以s開頭,以d.sh結尾的文件,並且忽略大小寫

wKiom1eyua-i7jYOAAAebbrQcuc359.png

EX.匹配/testdir/shells下面以s開頭,以.sh結尾的文件

wKioL1eywlry5bMcAAAgygxDX0w480.png


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

    -user USERNAME:查找屬主爲指定用戶(UID)的文件

    -group GRPNAME: 查找屬組爲指定組(GID)的文件

    -uidUserID:查找屬主爲指定的UID號的文件

    -gidGroupID:查找屬組爲指定的GID號的文件

    -nouser:查找沒有屬主的文件

    -nogroup:查找沒有屬組的文件


EX.查找/testdir/shells/下面屬主爲w,屬組爲wan的文件

wKioL1eyxILC_QqoAAAyD3V5FQU450.png

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

     -type TYPE:

        f: 普通文件

        d: 目錄文件     

        l: 符號鏈接文件

        s:套接字文件

        b: 塊設備文件

        c: 字符設備文件

        p: 管道文件


EX.查找/testdir/shells/下面的目錄文件

wKioL1eyxaKym5NSAAAzgPtwzPM713.png


(4)組合條件: 

    與:-a    (默認情況下面已經是-a,例如 -user A -group A跟-user A -a -group A是一個意思)

    或:-o

    非:-not, !


EX.查找屬組爲w或者屬組爲w的文件,注意,用-o的時候,前後都需要加一個-ls.否則,只顯示後者(即-group w的-ls的結果)

wKioL1eyzBDB1NUXAAAlYm0DAy0693.png


(5)德·摩根定律:

    ( 非 P ) 或 ( 非 Q ) = 非 ( P 且 Q )

    ( 非 P ) 且 ( 非 Q ) = 非 ( P 或 Q )


EX.查找屬主和屬組都不是root的文件

wKioL1eyz5SCqj7jAABFfbWYvf0149.png


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

    -size [+|-]#UNIT

    常用單位:k, M, G

    #UNIT: (#-1, #]

    如:6k 表示(5k,6k]

    -#UNIT:[0,#-1]

    如:-6k 表示[0,5k]

    +#UNIT:(#,∞)

    如:+6k 表示(6k,∞)


EX.查找/testdir/shells/目錄下文件大於1k的文件

wKioL1ey0jfQzLLSAAAw0ttQwN4765.png

EX.查找/testdir/shells/目錄下文件大於1k的文件,並且排除bierendesh這個目錄

wKioL1ey18bA1vjXAAAjQUdBV_I929.png


(7)根據時間戳:

    以“天”爲單位;

    -atime[+|-]#  訪問時間

         #: [#,#+1)    無符號:表示短於(#+1)>x>=#天的時間段被訪問過

        +#: [#+1,∞]   表示(#+1)天之外被訪問過

        -#: [0,#)      表示#天內被訪問過的

    -mtime        修改時間

    -ctime        改變時間

    以“分鐘”爲單位:

    -amin

    -mmin

    -cmin


EX.找出~/bin目錄下面兩天內修改過的文件並且按照提示刪除

wKioL1ey26zT6lvjAACmLnIrwJU097.png

EX.找出~/bin目錄下面兩天內修改過的文件並且直接刪除

wKioL1ey3HLy9sLrAACTRibQ768009.png


(8)根據權限查找:

    -perm [/|-]MODE

    MODE: 精確權限匹配

    /MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關係,+ 從centos7開始淘汰

    -MODE:每一類對象都必須同時擁有指定權限,與關係

    0 表示不關注


EX.精確查找權限爲644的文件

wKiom1ey9myDW9R2AAC0RIMxSEU549.png


EX.查找u,g,o組都至少有讀和執行權限的文件

wKioL1ey9xLSolsEAAC36hO10O8817.png

EX.查找u,g,o其中一個有讀寫權限的文件和目錄

wKiom1ey-K3i2noYAAB9HUKLzxk892.png


4.find命令的處理動作:

-print:默認的處理動作,顯示至屏幕;


-ls:類似於對查找到的文件執行“ls -l”命令

-delete:刪除查找到的文件;

-flsfile:查找到的所有文件的長格式信息保存至指定文件中

-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令;

    對於每個文件執行命令之前,都會交互式要求用戶確認

-exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令

    {}: 用於引用查找到的文件名稱自身

find傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令

有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題

    find | xargsCOMMAND


EX.處理動作示例

(1)刪除符合u=讀,或g=任意,或o=任意的文件

wKioL1ey-8eAozckAACqurU6eVU562.png


EX.把搜索出來的結果存檔到一個指定的文件

wKioL1ey_eGyHV-tAAC126-gAzk555.png


EX.搜索指定文件並且對符合條件的文件執行指定命令,-ok是會詢問,換成-exec則直接執行

wKiom1ey_ovCc4R6AABEfKIEWlc490.png

小總結:find命令相當強大,但是各種參數也是很多的,需要查找時間的關係,還有權限/和-符號代表的意義。以及不要搞混亂德·摩根定律。


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


compress/uncompress 命令的使用


compress [-dfvcVr] [-b maxbits] [file ...]

    -d: 解壓縮,相當於 uncompress

    -c: 結果輸出至標準輸出,不刪除原文件

    -v: 顯示詳情

uncompress解壓縮

zcat file.Z>file 能查看壓縮文檔並且重定向到指定文件,相當於~解壓縮..到~


EX.compress示例

wKiom1ezBKPiwk6LAABLRUSsBoU651.png


gzip/gunzip 命令的使用


gzip[OPTION]... FILE ...

    -d: 解壓縮,相當於gunzip

    -c: 將壓縮或解壓縮的結果輸出至標準輸出

    -#:1-9,指定壓縮比,值越大壓縮比越大

zcat:不顯式解壓縮的前提下查看文本文件內容

EX.示例

gzip -c messages >messages.gz

gzip -c -d messages.gz > messages

zcat messages.gz > messages

wKioL1ezBceCsb1cAABJgK56Xd0436.png

EX.通過重定向解壓了並保持原文件的案例

wKiom1ezBp7wfIACAABUpmZyZ_8021.png

bzip2/bunzip2/bzcat 命令的使用


bzip2 [OPTION]... FILE ...

    -k: keep, 保留原文件

    -d:解壓縮

    -#:1-9,壓縮比,默認爲6

bzcat:不顯式解壓縮的前提下查看文本文件內容


EX.用bzip2壓縮文件並且保留原文件的示例

wKioL1ezB3eDJxKOAAA_BMEW7lA447.png


xz/unxz/xzcat 命令的使用


xz[OPTION]... FILE ...

    -k: keep, 保留原文件

    -d:解壓縮

    -#:1-9,壓縮比,默認爲6

xzcat: 不顯式解壓縮的前提下查看文本文件內容

wKioL1ezCAHzqlkrAABEEOGrASU848.png


zip/unzip 命令的使用


打包壓縮目錄

zip –r 指定壓縮文件 壓縮目錄

解包解壓縮

unzip sysconfig.zip

這個命令最大的亮點是可以壓縮目錄,其他命令暫時都不支持壓縮目錄。


示例:

cat /var/log/messages | zip message -

unzip -p message > message


EX.壓縮目錄,需要注意輸入命令時候的壓縮文件和目錄位置

wKioL1ezDJrgspIRAACHzkPCeZs010.png

EX.解壓目錄到指定路徑

wKiom1ezFtXi3oDGAABBTYOD2y4601.png

wKiom1ezFuTARoquAAAoTkFfl5s860.png



tar 命令的使用


tar [OPTION]...打包,並不壓縮文件。(此命令需要自行添加後綴名,否則有可能不能識別)

    -cf打包文件,並不壓縮

    -v          能看見過程

    -t 預覽tar包裏面的文件

    -xvf解壓tar包,默認解壓到當前目錄

    -C 指定解壓路徑

    -zcvf       打包並且壓縮成*.tar.gz

    -z          gz方式壓縮

    -Jxz方式壓縮

    -j bz2方式壓縮


(1) 創建歸檔

tar -c -f /PATH/TO/SOMEFILE.tar FILE...

tar -zcvf /PATH/TO/SOMEFILE.tar FILE...

wKioL1e1IwWwVQxbAABDRwBB_PY204.png

(2) 查看歸檔文件中的文件列表

tar -t -f /PATH/TO/SOMEFILE.tar

wKioL1e1IZnD1pEXAABrWqGhXWk504.png

(3) 展開歸檔

tar -x -f /PATH/TO/SOMEFILE.tar (解壓到當前目錄)

tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/  (解壓到指定目錄)

wKiom1e1IVTQDuTwAAA__C3QuXo980.png


cpio 命令的使用


複製從或到文件

cpio命令是通過重定向的方式將文件進行打包備份,還原恢復的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件。

cpio[選項] > 文件名或者設備名

cpio[選項] < 文件名或者設備名

[option]選項

    -o 將文件拷貝打包成文件或者將文件輸出到設備上

    -i解包,將打包文件解壓或將設備上的備份還原到系統

    -t 預覽,查看文件內容或者輸出到設備上的文件內容

    -v 顯示打包過程中的文件名稱。

    -d 解包生成目錄,在cpio還原時,自動的建立目錄

    -c 一種較新的存儲方式


將etc目錄備份:

find ./etc -print |cpio -ov >etc.cpio

wKioL1e1JQ2h-bPMAABWHzrjM4Q268.png

內容預覽

cpio–tv< etc.cpio

wKioL1e1JVKCCoQPAABbPWxrhw0382.png

要解包文件

cpio–iv <etc.cpio

cpio–idv< etc.cpio

wKiom1e1JjOhpSSkAABShnzyn5M298.png

小結:壓縮和歸檔軟件,用得最多的還是gzip和tar,還有cpio,到後面會有更加詳細的描述。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章