clsass 10 shell編程(二)及文件查找及壓縮

一、選擇執行(條件判斷if)

流程控制

過程式編程語言:

    順序執行
    選擇執行
    循環執行

使用read 命令來接受輸入

使用read 來把輸入值分配給一個或多個shell變量:
    -p 指定要顯示的提示
    -t TIMEOUT
read 從標準輸入中讀取值,給每個單詞分配一個變量所有剩余單詞都被分配給最后一個變量
read -p “Enter a filename: “ FILE

條件選擇if 語句

選擇執行:

注意:if 語可嵌套

單分支    if  判斷條件:then
         條件為真的分支代碼    
       fi
雙分支    
       if  判斷條件; then
         條件為真的分支代碼   
       else
         條件為假的分支代碼   
       fi

if 語句

多分支    if  CONDITION1 ; then          、
                    if-true    
             elif CONDITION2 ; then           
                    if-ture   
             elif CONDITION3 ; then         
                    if-ture           
                    ...
         else
           all-false
         fi
逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而后 結束整個if語句

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    
    case $1 in
    start)
    
        ;;
    stop)
    
        ;;
    restart)
    
        ;;
    status)
        ;;
    esac

二、文件查找

文件查找

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

locate

查詢系統上預建的文件索引數據庫
   /var/lib/mlocate/mlocate.db依賴于事先構建的索引
索引的構建是在系統較為空閑時自動進行( 周期性 任務), 管理員手動更新數據庫(updatedb)
索引構建過程需要遍歷整個根文件系統,極 消耗資源
工作特點:
    ?  查找 速度 快
    ?  模糊 查找
    ?  非實時查找
    ?  搜索的是文件的全路徑,不僅僅是文件名
    ?  可能只搜索用戶具備讀取和執行權限的目錄

locate 命令

locate KEYWORD
有用的選項
    ? -i 執行區分大小寫的搜索
    ? -n N 只列舉前N 個匹配項目
locate foo
    ? 搜索名稱或路徑中帶有“foo ”的文件
locate -r ‘\.foo$’
    ? 使用Regex 來搜索以“.foo ”結尾的文件    
 ***注意***
 locate  可以指定搜索范圍,結果尾模糊搜索
 
   [root@6 ~]# locate  /  .sh
 
     -r  --regexp  為全局搜索,擴展正則表達式較精確查找
   [root@6 ~]# locate    -r   '\.sh$' |wc -l

find

實時查找工具,通過遍歷指定路徑完成文件查找;
工作特點:
    ? 查找速度略慢
    ? 精確查找
    ? 實時查找
    ? 可能只搜索用戶具備讀取和執行權限的目錄



語法:

find [OPTION]... [ 查找路徑] [ 查找條件] [ 處理動作]查找路徑:指定具體目標路徑;默認為當前目錄

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

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

查找條件

根據文件名和inode 查找: 
    -name " 文件名稱" :支持使用glob 
           *, ?, [], [^]     
           “  ”  需要加引號
    -iname " 文件名稱" :不區分字母大小寫
    -inum n 按inode 號查找
    -samefile name 相同inode號的文件
    
     [root@6 bin]# find / -samefile /dev -ls
     
    -links n 鏈接數為n的文件
    
     [root@6 bin]# find / -links 10 

    -regex "PATTERN" :以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱
        [root@6 ~]# find / -regex  '.*.sh$' 
        /tmp/keyring-NSUSmG/socket.ssh
        /tmp/keyring-89q2lx/socket.ssh
        /tmp/keyring-YaRraG/socket.ssh
        /tmp/keyring-IuDmPE/socket.ssh
        /tmp/keyring-ZeIVAk/socket.ssh
        /tmp/keyring-9TFDWv/socket.ssh
        /tmp/keyring-nLuDLL/socket.ssh
        /tmp/keyring-DEtZIt/socket.ssh
        /tmp/keyring-BRIf2d/socket.ssh

查找條件

根據屬主、屬組查找:
    -user USERNAME :查找屬主為指定用戶(UID) 的文件    
    -group GRPNAME:  查找屬組為指定組(GID) 的文件    
    -uid UserID :查找屬主為指定的UID 號的文件    
    -gid GroupID :查找屬組為指定的GID 號的文件    
    -nouser :查找沒有屬主的文件    
    -nogroup :查找沒有屬組的文件    
     find  /  -nouser  -nogroup    并且


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


組合條件:
    與:-a
    或:-o
    非:-not, !
      find  !  
 
   
德· 摩根 定律:
    (非 P) 或 (非 Q) =  非(P 且 Q)
    (非 P) 且 (非 Q) =  非(P 或 Q)
示例:

2016-8-16 1.JPG

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

2016-8-16 2.JPG

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

find 示例

find -name snow.png
  ? 搜索名為snow.png 的文件
find -iname snow.png
  ? 不分大小寫地搜索名為snow.png 、Snow.png、 SNOW.PNG 等的文件
    find / -name “*.txt”
    find /var –name “*log*”
    find -user joe -group joe
    搜索被用戶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,且文件名不以f 開頭的文件
  find /tmp \( -not -user root -a -not -name 'f*' \) -ls
  find /tmp -not \( -user root -o -name 'f*' \) –ls
  
***排除 目錄

? 示例:查找/etc/ 下,除/etc/sane.d 目錄的其它所有.conf 后綴的文件

    find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf” -print
    [root@6 bin]# find /root -path '/root/bin' -a -prune -o -name "*.sh"  根據文件大小來查找:
    -size [+|-]#UNIT
        常用單位:k, M, G    #UNIT: (#-1, #]
        如:6k  表示(5k,6k]
    -#UNIT :[0,#-1]
        如: :-6k  表示[0,5k]
    +#UNIT :(#, ∞ )
        如: :+6k  表示(6k ,∞)
        
        -10k  [0.9k]       
         10k  (9,10k]
         +10k  (10k,+∞)

根據時間戳:
  以“天”為單位;
    -atime [+|-]#,
        #: [#,#+1)
        +#: [#+1, ∞ ]
        -#: [0,#)
        -mtime
        -ctime
  以“分鐘”為單位:
        -amin
        -mmin
        -cmin
        
      -atime  -7 [0,7)
   -atime   7 [7,8)
    -atime  +7 [8,+∞)
    

根據權限查找:
-perm [/|-]MODE
       MODE: 精確權限匹配
      /MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即 可,或關系,+  從centos7 開始淘汰
      -MODE:每一類對象都必須同時擁有指定權限,與關系      0  表示不關注    020  
    ?  find -perm 755 會匹配權限模式恰好是755 的文件
    ?  只要當任意人有寫權限時,find -perm +222 就會匹配
    ?  只有當每個人都有寫權限時,find -perm -222 才會匹配
    ?  只有當其它人(other )有寫權限時,find -perm -002才會匹配
    find -perm /002 === find -perm -002
    ***  摩根定律同樣適用 
   ?  只要當所有人都沒有寫權限時,find  -not -perm +222 才會匹配
   ?  只有當任意人沒有寫權限時,find -not -perm -222 就會匹配
   ?  只有當其它人(other )沒有寫權限時,find -not -perm -002才會匹配

處理動作

-print :默認的處理動作,顯示至屏幕;
-ls :類似于對查找到的文件執行“ls -l” 命令
-delete :刪除查找到的文件;
-fls file:查找到的所有文件的長格式信息保存至指定文件中
-ok COMMAND {} \;  對查找到的每個文件執行由find -perm -222 -ok rm {} \;
COMMAND 指定的命令;對于每個文件執行命令之前,都會交互式要求用戶確認
-exec COMMAND {} \;  對查找到的每個文件執行由COMMAND 指定的命令

  {}: 用于引用查找到的文件名稱自身
 [root@6 bin]# find /testdir/bin -regex '^.*\.sh$' -exec chmod 111 {} \; find傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令
 有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題  find | xargs COMMAND
  [root@6 bin]# find /testdir/bin -regex '^.*\.sh$'  |xargs  chmod 777

find 示例

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

Gnome 搜索工具

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

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

file-roller
compress/uncompress: .Zgzip/gunzip: .gzbzip2/bunzip2: .bz2xz/unxz: .xzzip/unzip
tar
cpio

compress/uncompress

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

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

bzip2/bunzip2/bzcat

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

xz/unxz/xzcat

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

zip/unzip

打包壓縮    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 -a  -group mail  -ls

[root@6 ~]# find /var -user root -a -group mail  -ls
394580    4 drwxrwxr-x   2 root     mail         4096 8月 16 09:30 /var/spool/mail
393528   16 -rw-------   1 root     mail        13723 8月 16 09:30 /var/spool/mail/root
393317    4 -rw-rw----   1 root     mail         2444 7月 31 22:21 /var/spool/mail/lvasu

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

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

[root@6 ~]# find /var -not \( -user root -o -user lp -o -user gdm\) -ls
find: “gdm)” is not the name of a known user
[root@6 ~]# find /var -not \( -user root -o -user lp -o -user gdm \) -ls
402941    4 drwxr-xr-x   2 ntp      ntp          4096 5月 12 04:04 /var/log/ntpstats
400971    0 -rw-r--r--   1 rpcuser  rpcuser         0 5月 11 14:22 /var/lib/nfs/state
659692    4 drwx------   4 rpcuser  rpcuser      4096 7月 20 17:13 /var/lib/nfs/statd
799382    4 drwx------   2 rpcuser  rpcuser      4096 5月 11 14:22 /var/lib/nfs/statd/sm
922887    4 drwx------   2 rpcuser  rpcuser      4096 5月 11 14:22 /var/lib/nfs/statd/sm.bak
1183280    4 drwx------   2 pulse    pulse        4096 2月  3  2016 /var/lib/pulse
1179932    4 drwx------   2 apache   apache       4096 5月 12 03:29 /var/lib/dav
1050630    4 drwxr-xr-x   2 ntp      ntp          4096 5月 12 04:04 /var/lib/ntp

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

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

[root@6 ~]# find /var -mtime -7 -not \( -user root -o -user postfix \) -ls
1184780    4 drwx--x--x   2 gdm      gdm          4096 8月 16 08:54 /var/run/gdm/auth-for-gdm-BmBwqG
1184791    4 -rw-------   1 gdm      gdm            58 8月 16 08:54 /var/run/gdm/auth-for-gdm-BmBwqG/database
400934    4 dr-x--x--x   2 lp       sys          4096 8月 16 08:54 /var/run/cups/certs
393310    4 -rw-r--r--   1 rpcuser  rpcuser         5 8月 16 08:54 /var/run/rpc.statd.pid
393565    0 -rw-rw----   1 tom      mail            0 8月 15 20:11 /var/spool/mail/tom
393276    4 -rw-------   1 rpc      rpc           164 8月 15 22:15 /var/cache/rpcbind/portmap.xdr
393274    4 -rw-------   1 rpc      rpc           852 8月 15 22:15 /var/cache/rpcbind/rpcbind.xdr

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

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

[root@6 ~]# find  / \( -nouser -o -nogroup \) -atime -7   -ls
666130    4 drwx------   2 1001     1001         4096 8月  1 16:55 /home/ha2
666129    4 drwx------   2 1000     1000         4096 8月  1 16:55 /home/ha1
666131    4 drwx------   2 1002     1002         4096 8月  1 16:55 /home/ha3
666105    4 drwx------   4 4322     4322         4096 8月  2 16:55 /home/app
666107    4 drwxr-xr-x   4 4322     4322         4096 7月 20 16:58 /home/app/.mozilla
666108    4 drwxr-xr-x   2 4322     4322         4096 8月 18  2010 /home/app/.mozilla/extensions
666109    4 drwxr-xr-x   2 4322     4322         4096 8月 18  2010 /home/app/.mozilla/plugins
666112    4 drwxr-xr-x   2 4322     4322         4096 11月 12  2010 /home/app/.gnome2

 

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

   find  /etc  -type  f  -size  +1k

[root@6 ~]# find /etc -type  f  -size  +1k  -ls
2098541    8 -rw-r--r--   1 root     root         4922 5月 11 02:37 /etc/oddjobd.conf
2098686    4 -rw-r--r--   1 root     root         2108 11月 11  2010 /etc/bluetooth/main.conf
2098455    4 -rwxr-xr-x   1 root     root         3078 5月 11 06:33 /etc/dhcp/dhclient.d/nis.sh
2098427    4 -rwxr-xr-x   1 root     root         2140 1月 26  2016 /etc/dhcp/dhclient.d/ntp.sh
2097538    4 -rw-r--r--   1 root     root         1833 8月  2 16:32 /etc/login.defs
2098786    8 -rw-r--r--   1 root     root         6682 5月 11 02:41 /etc/screenrc

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

  find   /etc   -not  -perm   /222

[root@6 ~]# find /etc -not -perm  /222 -ls
2097528    4 -r--------   1 root     root           45 7月 20 17:00 /etc/openldap/certs/password
2097181    4 ----------   1 root     root          749 8月 15 08:57 /etc/gshadow-
2098680    4 -r--r--r--   1 root     root          324 5月 11 01:32 /etc/ld.so.conf.d/kernel-2.6.32-642.el6.x86_64.conf
2099393    4 -r--r-----   1 root     root         3729 12月  8  2015 /etc/sudoers
2099204    4 -r--r--r--   1 root     root           76 2月 22 07:18 /etc/lvm/profile/thin-generic.profile
2099205    4 -r--r--r--   1 root     root           80 2月 22 07:18 /etc/lvm/profile/thin-performance.profile
2099201    4 -r--r--r--   1 root     root          338 2月 22 07:18 /etc/lvm/profile/cache-smq.profile
2099202    4 -r--r--r--   1 root     root         2391 5月 11 18:18 /etc/lvm/profile/command_profile_template.profile

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

  find    /etc   -not  -perm     -111

[root@6 ~]# find /etc -not -perm -111  -ls
2099350    4 -rw-r--r--   1 root     root          291 5月 11 06:10 /etc/rsyslog.d/spice-vdagentd.conf
2098425    4 drwxr-x---   3 root     root         4096 5月 12 03:22 /etc/dhcp
2097538    4 -rw-r--r--   1 root     root         1833 8月  2 16:32 /etc/login.defs
2098786    8 -rw-r--r--   1 root     root         6682 5月 11 02:41 /etc/screenrc
2098783    4 -rw-r--r--   1 root     root           98 8月 16 08:54 /etc/resolv.conf
2097522    4 -rw-r--r--   1 root     root          662 8月 29  2007 /etc/logrotate.conf

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

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

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

[root@6 ~]# find /etc/init.d/ -perm -111 -a  -perm -002  -ls
2098781    0 -rwxr-xrwx   1 root     root            0 8月 16 12:45 /etc/init.d/a
[root@6 ~]# find    /etc/init.d/     -perm  -113
/etc/init.d/a

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

(0)
lvasulvasu
上一篇 2016-08-18 10:10
下一篇 2016-08-18 13:36

相關推薦

  • RPM軟件包管理器及前端工具yum

    目前在linux系統之上軟件安裝方式最常見的有兩種,分別是: dpkg:這個機制最早是由Debian Linux社區所開發出來的,透過dpkg的機制,Debian提供的軟件就能夠簡單的安裝起來,同時還能提供安裝后的軟件資訊,實在非常不錯。只要是衍生于Debian的其他linux發行版,大多使用dpkg這個機制來管理軟件的,包括B2D、Ubuntu等等。 RP…

    Linux干貨 2016-08-20
  • 無痛之ext3升ext4[原創]

    一臺文件存儲服務器單目錄下子目錄已經突破31998數限制,造成無法繼續創建子目錄,服務器系統環境為CentOS5.4 內核版本為2.6.18。解決方案只能是升級到ext4文件系統,首先到https://ext4.wiki.kernel.org/index.php/Ext4_Howto查了一下資料,文中的第一句便是“Ext4 was released as a…

    Linux干貨 2015-03-27
  • 初入linux

    一、認識linux 1、在windows中通過盤符區分文件存放位置,而linux中沒有盤符之說,只有文件和文件夾 2、在linux中,萬物從根開始,沒有后綴之說 二、文件系統的目錄結構 /:根目錄 /boot:系統啟動的相關配置文件 /dev:設備文件 塊設備:隨機訪問,數據塊為單位 字符設備:線性訪問,按字符為單位 設備號:主設備號(major)和次設備號…

    Linux干貨 2017-05-20
  • M20-1 8月5日 文本查看工具以及文本處理工

    一、文本查看工具:  cat,tac,rev cat用法:cat [option]..[FILE]..   cat選項:    -E:顯示行結束符$    -n:對顯示出的每一行進行編號    -A:顯示所有控制符    -b:非空行編號   &nb…

    Linux干貨 2016-08-08
  • Linux網絡管理

                          Linux網絡管理   本章內容: 網絡概念 OSI七層模型 網絡設備 TCP/IP IP地址 配置網絡 實現網絡組 測試網絡 網絡工具   網絡用戶應用程序: WEB瀏覽器(…

    系統運維 2016-09-12
  • Linux網絡管理相關工具

      Linux本身提供了許多用于網絡測試、網絡排錯、網絡狀態分析的工具,下面來看幾個比較常用的工具。   一、ping命令   ping命令是利用ICMP協議還測試網絡的連通性。   命令格式:ping [option] IP     常用選項:       -c #:…

    Linux干貨 2016-01-14

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-19 12:02

    文章結構層次清晰,排版很精美,f有理論也有實踐,對腳本的語法總結很詳細,可以運用所學的腳本只是實現具體的功能來加深自己對腳本點理解。

欧美性久久久久