if case 語句 find locate 文件查找 和 壓縮解壓縮工具 簡介

1 shell腳本編程之 條件選擇if 條件判斷case  2 文件查找 find locate 以及壓縮和解壓縮工具


過程式編程語言: 

順序執行 

選擇執行 

循環執行



條件選擇之 if語句


選擇執行:  

注意:if語句可嵌套  

 單分支 if 判斷條件:then 條件爲真的分支代碼 fi 結束 

 雙分支 if 判斷條件; then 條件爲真的分支代碼 else 條件爲假的分支代碼 fi 結束



多分支 

if CONDITION1; then 

    if-true 

elif CONDITION2; then 

    if-ture 

elif CONDITION3; then 

    if-ture 

    ... 

else 

    all-false 

fi  

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


例如


 根據命令的退出狀態來執行命令 

 if ping -c1 -W2 station1 &> /dev/null; then 

     echo 'Station1 is UP'  

 elif grep "station1" ~/maintenance.txt &> /dev/null then 

     echo 'Station1 is undergoing maintenance‘ 

 else 

     echo 'Station1 is unexpectedly DOWN!' 

     exit 1 

 fi


條件判斷:case語句 


case 變量引用 in 

PAT1) 

    分支1 

    ;; 

PAT2) 

    分支2 

    ;; 

... *) 

    默認分支 

    ;; 

esac



case支持glob風格的通配符: 

  *: 任意長度任意字符 

  ?: 任意單個字符 

  []:指定範圍內的任意單個字符 

  a|b: a或b


  文件查找之 locate 和 find


  文件查找:locate, find 

    locate:非實時查找(數據庫查找若想精確查找可更新數據庫 不過更新過程中很佔用系統資源) 

    find:實時查找(屬於精確查找 不過查找速度較慢)


Locate


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

   文件索引數據庫的路徑:/var/lib/mlocate/mlocate.db  

   依賴於事先構建的索引; 

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

   工作特點: 

   查找速度快; 

   模糊查找; 

   非實時查找 搜索的是文件的全路徑,不僅僅是文件名 可能只搜索用戶具備讀取和執行權限的目錄


locate命令 


locate KEYWORD  

有用的選項  

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

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

   locate  foo  搜索名稱或路徑中帶有“foo”的文件

   locate  -r  ‘\.foo$’  使用Regex來搜索以“.foo”結尾的文件


Find


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

工作特點: 

查找速度略慢 

精確查找 

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


語法:

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

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

查找條件:指定的查找標準,可以文件名、大小、類型、 權限等標準進行;默認爲找出指定路徑下的所有文件 處理動作:對符合條件的文件做操作,默認輸出至屏幕


查找條件

1 文件名和inode查找

2屬主屬組查找

3文件類型查找

4文件件大小查找

5時間戳查找

6權限查找


根據文件名和inode查找: 

   -name "文件名稱":支持使用glob *, ?, [], [^] 

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

   -inum n  按inode號查找 

   -samefile name  相同inode號的文件 

   -links n   鏈接數爲n的文件 -regex "PATTERN":以PATTERN匹配整個文件路徑字 符串,而不僅僅是文件名稱



根據屬主、屬組查找: 

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

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

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

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

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

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



根據文件類型查找: 

   -type TYPE: 

   f: 普通文件 

   d: 目錄文件 

   l: 符號鏈接文件 

   s:套接字文件 

   b: 塊設備文件 

   c: 字符設備文件 

   p: 管道文件



根據文件大小來查找: 

-size [+|-]#UNIT 

  常用單位:k, M, G           

   #UNIT: (#-1, #],如:6   5-6 

   -#UNIT:[0,#-1], 如:-6  0-5

   +#UNIT:(#,∞),   如:+6  6-∞



根據時間戳: 

 以“天”爲單位; 

   -atime [+|-]#,  

   #: [#,#+1)       如:6   6-7

   +#: [#+1,∞]      如:+6  6-∞

   -#: [0,#)        如:-6  0-6

   -mtime 

   -ctime 

以“分鐘”爲單位: 

   -amin 

   -mmin 

   -cmin



根據權限查找: 

-perm [/|-]MODE 

   MODE: 精確權限匹配 

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

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

   find -perm 755 會匹配權限模式恰好是755的文件  

   只要當任意人有寫權限時,find -perm +222就會匹配 

   只有當每個人都有寫權限時,find -perm -222纔會匹配  

   只有當其它人(other)有寫權限時,find -perm -002才 會匹配



處理動作



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

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

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

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

   -ok COMMAND {} \; 對查找到的每個文件執行由 COMMAND指定的命令; 對於每個文件執行命令之前,都會交互式要求用戶確認


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

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

   find傳遞查找到的文件至後面指定的命令時,查找到所有符合 條件的文件一次性傳遞給後面的命令 有些命令不能接受過多參數,此時命令執行可能會失敗,下 面方式可規避此問題 find | xargs COMMAND 



組合條件: 

   與:-a 

   或:-o 

   非:-not, !


德·摩根定律: 非(P 且 Q) = (非 P) 或 (非 Q) 非(P 或 Q) = (非 P) 且 (非 Q)

!A -a !B = !(A -o B) !A -o !B = !(A -a B)


加括號取反


壓縮、解壓縮工具


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

   -d: 解壓縮,相當於 

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

   -v: 顯示詳情

   uncompress 解壓縮 zcat file.Z >file


2 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 [OPTION]... FILE ... 

   -k: keep, 保留原文件 

   -d:解壓縮 

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

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


4 xz [OPTION]... FILE ... 

   -k: keep, 保留原文件; 

   -d:解壓縮 

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

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



5 打包壓縮 

   zip –r sysconfig sysconfig/  

  解包解壓縮 

   unzip sysconfig.zip 

   cat /var/log/messages | zip message  

   unzip -p message > message



練習


1、查找/var目錄下屬主爲root,且屬組爲mail的所有文件


 find /var  -user root  -group  mail -ls



電腦演示

[root@localhost /]# find /var  -user root  -group  mail -ls

1443089    4 drwxrwxr-x   2 root     mail         4096 Aug 13 10:34 /var/spool/mail

1444185    4 -rw-------   1 root     mail         2688 Aug 13 09:38 /var/spool/mail/root

[root@localhost /]# 






2、查找/var目錄下不屬於root、lp、gdm的所有文件


 find /var -not \( -user root  -o -user lp -o -user gdm \) -ls


電腦演示

root@localhost /]# find /var  -user root  -group  mail -ls

1443089    4 drwxrwxr-x   2 root     mail         4096 Aug 13 10:34 /var/spool/mail

1444185    4 -rw-------   1 root     mail         2688 Aug 13 09:38 /var/spool/mail/root

[root@localhost /]# find /var -not \( -user root  -o -user lp -o -user gdm \) -ls

1443544    4 drwx--x---   2 postfix  postdrop     4096 Aug 12 13:57 /var/spool/postfix/public

1444012    0 srw-rw-rw-   1 postfix  postfix         0 Aug 12 13:57 /var/spool/postfix/public/showq

1444007    0 srw-rw-rw-   1 postfix  postfix         0 Aug 12 13:57 /var/spool/postfix/public/flush

1444000    0 prw--w--w-   1 postfix  postfix         0 Aug 13 11:34 /var/spool/postfix/public/qmgr

1443999    0 srw-rw-rw-   1 postfix  postfix         0 Aug 12 13:57 /var/spool/postfix/public/cleanup

1443998    0 prw--w--w-   1 postfix  postfix         0 Aug 13 11:38 /var/spool/postfix/public/pickup

1443543    4 drwx------   2 postfix  root         4096 Aug 12 13:57 /var/spool/postfix/private

1444014    0 srw-rw-rw-   1 postfix  postfix         0 Aug 12 13:57 /var/spool/postfix/private/retry

1444018    0 srw-rw-rw-   1 postfix  postfix         0 Aug 12 13:57 /var/spool/postfix/private/lmtp

1444017    0 srw-rw-rw-   1 postfix  postfix         0 Aug 12 13:57 /var/spool/postfix/private/virtual

1444016    0 srw-rw-rw-   1 postfix  postfix         0 Aug 12 13:57 /var/spool/postfix/private/local

1444019    0 srw-rw-rw-   1 postfix  postfix         0 Aug 12 13:57 /var/spool/postfix/private/anvil





3、查找/var目錄下最近一週內其內容修改過,同時屬主不爲root,也不是postfix的文件

 

 find /var  -mtime -7 -not \( -user root -o -user postfix \) -ls



電腦演示

[root@localhost /]# find /var  -mtime -7 -not \( -user root -o -user postfix \) -ls

1444198    0 -rw-rw----   1 dadi     mail            0 Aug 13 10:18 /var/spool/mail/dadi

1444120    0 -rw-rw----   1 tiantian mail            0 Aug 13 10:17 /var/spool/mail/tiantian

1444075    0 -rw-rw----   1 tian     mail            0 Aug 12 14:53 /var/spool/mail/tian

1444174    0 -rw-rw----   1 hh       mail            0 Aug 13 10:34 /var/spool/mail/hh

1443974    4 -rw-r--r--   1 rpcuser  rpcuser         5 Aug 12 13:56 /var/run/rpc.statd.pid

1443210    4 dr-x--x--x   2 lp       sys          4096 Aug 12 13:56 /var/run/cups/certs

1444136    4 drwx--x--x   2 gdm      gdm          4096 Aug 12 13:57 /var/run/gdm/auth-for-gdm-Z9Ky4G

1444186    4 -rw-------   1 gdm      gdm            66 Aug 12 13:57 /var/run/gdm/auth-for-gdm-Z9Ky4G/database

[root@localhost /]# 




4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件

 

 find / \( -atime -7  -nouser  -o -nogroup \) -ls



電腦演示

[root@localhost /]# find / \( -atime -7  -nouser  -o -nogroup \) -ls

find: `/proc/5584/task/5584/fd/5': No such file or directory

find: `/proc/5584/task/5584/fd/5': No such file or directory

find: `/proc/5584/task/5584/fdinfo/5': No such file or directory

find: `/proc/5584/task/5584/fdinfo/5': No such file or directory

find: `/proc/5584/fd/5': No such file or directory

find: `/proc/5584/fd/5': No such file or directory

find: `/proc/5584/fdinfo/5': No such file or directory

find: `/proc/5584/fdinfo/5': No such file or directory

[root@localhost /]# 




5、查找/etc目錄下大於1M且類型爲普通文件的所有文件

 

 find /etc -size  +1M -type f



電腦演示

[root@localhost /]# find /etc -size  +1M -type f

/etc/selinux/targeted/modules/active/policy.kern

/etc/selinux/targeted/policy/policy.24

/etc/gconf/gconf.xml.defaults/%gconf-tree.xml

[root@localhost /]# 




6、查找/etc目錄下所有用戶都沒有寫權限的文件

 

 find /etc/  -not    -perm  /222 -ls

 find /etc/  -not    -perm  +222 -ls



電腦演示

[root@localhost /]# find /etc/  -not    -perm  /222 -ls

787420    4 -r--r--r--   1 root     root          460 May 11 13:00 /etc/dbus-1/system.d/cups.conf

788058    4 -r--r--r--   1 root     root          324 May 11 01:32 /etc/ld.so.conf.d/kernel-2.6.32-642.el6.x86_64.conf

786821    4 -r--------   1 root     root           45 Jul 19 20:17 /etc/openldap/certs/password

786733  192 -r--r--r--   1 root     root       194984 Jul 19 20:17 /etc/pki/ca-trust/extracted/java/cacerts

786729  340 -r--r--r--   1 root     root       346654 Jul 19 20:17 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt

786730  256 -r--r--r--   1 root     root       262042 Jul 19 20:17 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem

786731  204 -r--r--r--   1 root     root       208874 Jul 19 20:17 /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem

786732  208 -r--r--r--   1 root     root       208976 Jul 19 20:17 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem

788589    4 -r--r--r--   1 root     root          338 Feb 22 07:18 /etc/lvm/profile/cache-smq.profile

788591    4 -r--r--r--   1 root     root          828 May 11 18:18 /etc/lvm/profile/metadata_profile_template.profile

788593    4 -r--r--r--   1 root     root           80 Feb 22 07:18 /etc/lvm/profile/thin-performance.profile

788590    4 -r--r--r--   1 root     root         2391 May 11 18:18 /etc/lvm/profile/





7、查找/etc目錄下至少有一類用戶沒有執行權限的文件

 

 find /etc/ -not  -perm -111 -ls 


文件太多 不予顯示







8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件

 

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

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



電腦演示

[root@localhost /]# find /etc/init.d/  -perm -111 -a   -perm /002  

/etc/init.d/

/etc/init.d/f1


[root@localhost /]# find /etc/init.d/  -perm -113 

/etc/init.d/

/etc/init.d/f1

[root@localhost /]# 




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