2016-08-12
授課內容:
shell的流程控制
文件查找和壓縮
shell的流程控制:
過程式編程語言:
順序執行
選擇執行
循環執行(未講)
順序執行:
if語句:
單分支
if 判斷條件; then
條件為真的分支代碼
fi
雙分支
if 判斷條件; then
條件為真的分支代碼
else
條件為假的分支代碼
fi
多分支
if CONDITION1; then
if-true
elifCONDITION2; then
if-ture
elifCONDITION3; then
if-ture
…
else
all-false
fi
?逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而后結束整個if語句
注意,當then與if一行時,需要用;隔開,另起一行,則不需要添加;
例子:
[root@Centos7 shells]# cat createuser.sh #!/bin/bash #Version:1.0 #Create time:2016-08-12 11:09:20 #Description:使用一個用戶名做為參數,如果指定參數的用戶存在,就顯示其存在,否則添加之;顯示添加的用戶的id號等信息 read -p "please input a username: " USERNAME #`id $USERNAM` &> /dev/null if id $USERNAME &> /dev/null ; then echo "the user exist" exit 100 else useradd $USERNAME &> /dev/null echo "the user add sucessfully and its info is:`id $USERNAME`" exit 99 fi unset USERNAME
選擇執行:
case語句
case 變量引用 in
PART1)
COMMAND
;;
PART2)
COMMAND
;;
*) #其他情況
COMMAND
;;
esac
case支持glob風格的通配符:
*: 任意長度任意字符
?: 任意單個字符
[]:指定范圍內的任意單個字符
a|b: a或b
例子:
[root@Centos7 shells]# cat yesorno.sh #!/bin/bash #Version:1.0 #Create time:2016-08-12 11:24:09 #Description:寫一個腳本/root/bin/yesorno.sh,提示用戶輸入yes或no,并判斷用戶輸入的是yes還是no,或是其它信息 read -p "please input yes or no: " STRING case $STRING in 'yes'|'y'|'Y'|'YES') echo "your answer is yes" exit 100 ;; 'no'|'n'|'N'|'no'|'n0') echo "your answer is no" exit 99 ;; *) echo "your answer is other" exit 98 esac unset STRING
文件查找:
兩者的區別:locate是非實時查找(依賴于事先構建的數據庫索引),find是實時的遍歷查找
locate:
locate [OPTION]… PATTERN…
查詢系統上預建的文件索引數據庫
/var/lib/mlocate/mlocate.db
?依賴于事先構建的索引;
索引的構建是在系統較為空閑時自動進行(周期性任務);管理員手動更新數據庫(updatedb);
?索引構建過程需要遍歷整個根文件系統,極消耗資源;
?工作特點:
查找速度快;
模糊查找;
非實時查找
搜索的是文件的全路徑,不僅僅是文件名
可能只搜索用戶具備讀取和執行權限的目錄
find:實時的遍歷查找
find [OPTION]… [查找路徑] [查找條件] [處理動作]
[查找路徑]:指定具體目標路徑;默認為當前目錄
[查找條件]:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件
[處理動作]:對符合條件的文件做操作,默認輸出至屏幕
查找條件:
1、文件名和inode號
-name “filename” 支持使用glob *, ?, [], [^]
-iname “filename” 忽略文件名大小寫
-inum 按照inode號來查找
-samefile “filenam” 相同inode號的文件
-links n :查找鏈接數為n的文件
-regex “PATTERN”:以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱
2、根據屬主、屬組查找:
-user “username”
-group “groupname”
-uid “uid”
-gid “gid”
-nouser:查找沒有屬主的文件,指的是用戶已刪除,但其文件還沒有刪除
-nogroup:
3、根據文件類型查找:
-type
f:普通文件
d:目錄文件
b:
c:
p:
s:
l:
4、根據文件大小來查找:【理解數值的范圍】
-size [+|-]#size
常用單位:k, M, G
#UNIT: (#-1, #],如:6k
-#UNIT:[0,#-1], 如:-6k
+#UNIT:(#,∞), 如:+6k
5、按照文件的時間戳查找:【理解數值的范圍】
以“天”為單位;
-atime[+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分鐘”為單位:
-amin
-mmin
-cmin
6、根據權限查找:
-perm [/|-]mode
-perm 664:精確查找文件權限為664的文件
-perm /664:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系,【即屬主6,屬組6,其他4,只要滿足任意一個即可】
-perm -664:每一類對象都必須同時擁有指定權限,與關系,0 表示不關注,【即屬主擁有6,屬組擁有6,其他擁有4,必須滿足三個】
動作處理:
-print:默認的處理動作,顯示至屏幕;
-ls:類似于對查找到的文件執行“ls -l”命令
-delete:刪除查找到的文件;
-flsfile:查找到的所有文件的長格式信息保存至指定文件中
-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令;對于每個文件執行命令之前,都會交互式要求用戶確認
-exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令
? {}: 用于引用查找到的文件名稱自身
有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題
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)
文件壓縮:
目的:壓縮后的文件大小會減少,減少磁盤空間支出
大致原理:如文本love,會標記為一個單詞記號,這樣就可以大大縮減了文件大小,所以壓縮對純文本會特別明顯
壓縮格式:
.Z .gz .bz2 .xz
以上的壓縮工具只對單個文件進行壓縮,不能對整個目錄進行壓縮
壓縮工具:
1、compress(其壓縮文件后綴是.Z,默認壓縮后刪除原文件)
compress [-dfvcVr] [-b maxbits] [file …]
-d:解壓縮,相當于uncompress
-c:結果輸出至標準輸出,不刪除原文件
uncompress:解壓縮
由于此壓縮工具壓縮效果不理想,已被淘汰
2、gzip(其壓縮文件后綴是.gz,默認壓縮后刪除原文件)
gzip [OPTION]… FILE …
-d:解壓,相當于gunzip
-c:結果輸出至標準輸出,不刪除原文件
gunzip:解壓縮
zcat file..:再不解壓原文件的情況下臨時查看壓縮文件的內容
3、bzip2(其壓縮文件后綴是.bz2,默認壓縮后刪除原文件)
bzip2 [OPTION]… FILE …
-d:解壓,相當于bunzip2
-c:結果輸出至標準輸出,不刪除原文件
-k:保留原文件
bunzip2:解壓縮
bzcat:不顯式解壓縮的前提下查看文本文件內容
4、xz(其壓縮文件后綴是.xz,默認壓縮后刪除原文件)
-d:解壓,相當于unxz
-c:結果輸出至標準輸出,不刪除原文件
-k:保留原文件
xzcat:不顯式解壓縮的前提下查看文本文件內容
歸檔(打包)工具tar:
tar [options] [新的打包文件名] [需要打包的文件…]
-c:創建歸檔文件
-f “filename”:打包的文件名前必須要加-f參數
-z:以gzip方式壓縮歸檔文件
-x:展開歸檔文件
-t:不解歸檔的情況下查看歸檔的文件列表
-zcf: 歸檔并調用gzip壓縮
-zxf: 調用gzip解壓縮并展開歸檔,-z選項可省略
-jcf: 歸檔并調用bzip2壓縮
-jxf:調用bzip2解壓縮并展開歸檔,-j選項可省略
-Jcf: 歸檔并調用xz壓縮
-Jxf:調用xz解壓縮并展開歸檔,-J選項可省略
課后作業
一、
?1、查找/var目錄下屬主為root,且屬組為mail的所有文件
[root@Centos7 shells]# find /var -user root -group mail -ls 201327962 4 drwxrwxr-x 2 root mail 4096 Aug 12 12:47 /var/spool/mail 206290473 0 -rw-rw---- 1 root mail 0 Jul 21 11:36 /var/spool/mail/hill
?2、查找/var目錄下不屬于root、lp、gdm的所有文件
[root@Centos7 shells]# find /var -not \( -user root -o -user lp -o -user gdm \) -ls 203220108 0 drwxr-xr-x 2 unbound unbound 21 Jul 21 11:25 /var/lib/unbound 203220104 4 -rw-r--r-- 1 unbound unbound 758 Jul 21 11:25 /var/lib/unbound/root.key 68434676 0 drwx------ 2 tss tss 6 Nov 21 2015 /var/lib/tpm 952626 0 drwxr-xr-x 3 colord colord 50 Jul 21 11:39 /var/lib/colord 68460309 0 drwxr-xr-x 2 colord colord 6 Nov 20 2015 /var/lib/colord/icc 942229 4 -rw-r--r-- 1 colord colord 4096 Jul 21 11:39 /var/lib/colord/mapping.db 942230 8 -rw-r--r-- 1 colord colord 7168 Jul 21 11:39 /var/lib/colord/storage.db 991128 0 drwxr-xr-x 2 geoclue geoclue 6 Nov 20 2015 /var/lib/geoclue 1008615 0 drwx------ 2 rpc rpc 6 Nov 20 2015 /var/lib/rpcbind 68499359 0 drwxr-xr-x 2 chrony chrony 6 Nov 24 2015 /var/lib/chrony 1009006 0 drwx------ 2 setroubleshoot setroubleshoot 69 Jul 21 11:40 /var/lib/setroubleshoot 942213 8 -rw------- 1 setroubleshoot setroubleshoot 6192 Aug 9 15:56 /var/lib/setroubleshoot/setroubleshoot_database.xml 942216 0 -rw------- 1 setroubleshoot setroubleshoot 0 Jul 21 11:40 /var/lib/setroubleshoot/email_alert_recipients 135338699 0 drwx------ 4 rpcuser rpcuser 28 Jul 21 11:26 /var/lib/nfs/statd 203627550 0 drwx------ 2 rpcuser rpcuser 6 Nov 20 2015 /var/lib/nfs/statd/sm 1051683 0 drwx------ 2 rpcuser rpcuser 6 Nov 20 2015 /var/lib/nfs/statd/sm.bak 1051684 0 -rw-r--r-- 1 rpcuser rpcuser 0 Nov 20 2015 /var/lib/nfs/state 203764897 0 drwxr-x--x 7 qemu qemu 69 Jul 21 11:39 /var/lib/libvirt/qemu 2290015 0 drwxr-xr-x 2 qemu qemu 6 Jul 21 11:39 /var/lib/libvirt/qemu/save 70292549 0 drwxr-xr-x 2 qemu qemu 6 Jul 21 11:39 /var/lib/libvirt/qemu/snapshot 136778577 0 drwxr-xr-x 2 qemu qemu 6 Jul 21 11:39 /var/lib/libvirt/qemu/dump 206290506 0 drwxr-xr-x 3 qemu qemu 19 Jul 21 11:39 /var/lib/libvirt/qemu/channel 2301664 0 drwxr-xr-x 2 qemu qemu 6 Jul 21 11:39 /var/lib/libvirt/qemu/channel/target 70292550 0 drwxr-xr-x 2 qemu qemu 6 Jul 21 11:39 /var/lib/libvirt/qemu/nvram 68582074 0 drwx------ 2 pulse pulse 6 Nov 21 2015 /var/lib/pulse 205938566 0 drwx------ 2 postfix root 6 Jun 10 2014 /var/lib/postfix 135286592 0 drwxr-xr-x 2 chrony chrony 6 Nov 24 2015 /var/log/chrony 68478491 0 drwxrwxr-x 2 abrt abrt 6 Dec 1 2015 /var/cache/abrt-di 135464204 0 drwxr-x--- 3 qemu qemu 25 Jul 21 11:39 /var/cache/libvirt/qemu 203424845 0 -rw-rw---- 1 rpc mail 0 Jul 21 11:25 /var/spool/mail/rpc 206354276 0 -rw-rw---- 1 mandriva mail 0 Jul 28 15:46 /var/spool/mail/mandriva 206354278 0 -rw-rw---- 1 fedora mail 0 Jul 28 15:48 /var/spool/mail/fedora 206354310 0 -rw-rw---- 1 gentoo mail 0 Jul 30 14:20 /var/spool/mail/gentoo 206354320 0 -rw-rw---- 1 harry mail 0 Jul 30 14:21 /var/spool/mail/harry 206354325 0 -rw-rw---- 1 sarah mail 0 Jul 30 14:22 /var/spool/mail/sarah 205661267 0 -rw-rw---- 1 user2 mail 0 Aug 1 17:41 /var/spool/mail/user2 205661307 0 -rw-rw---- 1 user3 mail 0 Aug 1 17:41 /var/spool/mail/user3 205668959 0 -rw-rw---- 1 user111 mail 0 Aug 2 19:43 /var/spool/mail/user111 205668942 0 -rw-rw---- 1 openstack mail 0 Aug 3 09:27 /var/spool/mail/openstack 205668971 0 -rw-rw---- 1 alice mail 0 Aug 3 13:52 /var/spool/mail/alice 205668973 0 -rw-rw---- 1 tom mail 0 Aug 3 13:53 /var/spool/mail/tom 205668981 0 -rw-rw---- 1 user1 mail 0 Aug 3 14:50 /var/spool/mail/user1 205668974 0 -rw-rw---- 1 bash mail 0 Aug 7 08:59 /var/spool/mail/bash 206386952 0 -rw-rw---- 1 nihaoma mail 0 Aug 12 11:20 /var/spool/mail/nihaoma 135065135 0 drwx------ 2 abrt abrt 6 Dec 1 2015 /var/spool/abrt-upload 69970443 0 drwx------ 2 postfix root 6 Jun 10 2014 /var/spool/postfix/active 136261128 0 drwx------ 2 postfix root 6 Jun 10 2014 /var/spool/postfix/bounce 205938567 0 drwx------ 2 postfix root 6 Jun 10 2014 /var/spool/postfix/corrupt 2013438 0 drwx------ 2 postfix root 6 Jun 10 2014 /var/spool/postfix/defer 69970444 0 drwx------ 2 postfix root 6 Jun 10 2014 /var/spool/postfix/deferred 136261129 0 drwx------ 2 postfix root 6 Jun 10 2014 /var/spool/postfix/flush 205938568 0 drwx------ 2 postfix root 6 Jun 10 2014 /var/spool/postfix/hold 2013439 0 drwx------ 2 postfix root 6 Jun 10 2014 /var/spool/postfix/incoming 69970445 0 drwx-wx--- 2 postfix postdrop 6 Jun 10 2014 /var/spool/postfix/maildrop 205938569 0 drwx------ 2 postfix root 6 Jun 10 2014 /var/spool/postfix/private 2013440 0 drwx--x--- 2 postfix postdrop 6 Jun 10 2014 /var/spool/postfix/public 69970446 0 drwx------ 2 postfix root 6 Jun 10 2014 /var/spool/postfix/saved 136261131 0 drwx------ 2 postfix root 6 Jun 10 2014 /var/spool/postfix/trace 2013448 0 drwx------ 3 daemon daemon 29 Jul 21 11:31 /var/spool/at 70013921 0 drwx------ 2 daemon daemon 6 Nov 20 2015 /var/spool/at/spool 2013450 0 -rw------- 1 daemon daemon 0 Jul 21 11:31 /var/spool/at/.SEQ 821666 0 drwxr-xr-x 2 abrt abrt 6 Jul 21 11:37 /var/tmp/abrt 2304665 4 -rw-rw---- 1 3000 hill 595 Aug 2 14:50 /var/tmp/fstab
?3、查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件
[root@Centos7 shells]# find /var/ -mtime -7 -not \( -user root -o -user postfix \) -ls 942213 8 -rw------- 1 setroubleshoot setroubleshoot 6192 Aug 9 15:56 /var/lib/setroubleshoot/setroubleshoot_database.xml 69210322 0 drwxrwx--T 6 gdm gdm 79 Aug 12 08:30 /var/lib/gdm 205653757 4 -rw-r--r-- 1 gdm gdm 43 Aug 12 08:30 /var/lib/gdm/.pulse/d84e4562ec594069be53afee569c711e-default-sink 205653758 4 -rw-r--r-- 1 gdm gdm 42 Aug 12 08:30 /var/lib/gdm/.pulse/d84e4562ec594069be53afee569c711e-default-source 69338350 8 -rw------- 1 gdm gdm 6514 Aug 12 08:30 /var/lib/gdm/.ICEauthority 69338355 0 drwxr-xr-x 2 gdm gdm 17 Aug 12 08:30 /var/lib/gdm/.config/dconf 70297035 4 -rw-r--r-- 1 gdm gdm 451 Aug 12 08:30 /var/lib/gdm/.config/dconf/user 205653754 0 drwx------ 2 gdm gdm 52 Aug 12 08:30 /var/lib/gdm/.config/ibus/bus 205653736 4 -rw-r--r-- 1 gdm gdm 168 Aug 12 08:30 /var/lib/gdm/.config/ibus/bus/d84e4562ec594069be53afee569c711e-unix-0 69338356 0 drwx------ 2 gdm gdm 48 Aug 12 08:30 /var/lib/gdm/.local/share/telepathy/mission-control 70297036 4 -rw------- 1 gdm gdm 38 Aug 12 08:30 /var/lib/gdm/.local/share/telepathy/mission-control/accounts-goa.cfg 203877581 4 drwxr-xr-x 2 lp sys 4096 Aug 8 09:37 /var/log/cups 205668974 0 -rw-rw---- 1 bash mail 0 Aug 7 08:59 /var/spool/mail/bash 206386952 0 -rw-rw---- 1 nihaoma mail 0 Aug 12 11:20 /var/spool/mail/nihaoma
?4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件
[root@Centos7 shells]# find / -nouser -o -nogroup -atime -7 find: ‘/proc/11789/task/11789/fd/6’: No such file or directory find: ‘/proc/11789/task/11789/fdinfo/6’: No such file or directory find: ‘/proc/11789/fd/6’: No such file or directory find: ‘/proc/11789/fdinfo/6’: No such file or directory /var/tmp/fstab
?5、查找/etc目錄下大于1M且類型為普通文件的所有文件
[root@Centos7 shells]# find /etc/ -size +1M -type f -ls 136448114 3772 -rw-r--r-- 1 root root 3858924 Nov 21 2015 /etc/selinux/targeted/policy/policy.29 206290485 6852 -r--r--r-- 1 root root 7014922 Jul 21 11:37 /etc/udev/hwdb.bin 135580237 1336 -rw-r--r-- 1 root root 1367395 Mar 6 2015 /etc/brltty/zh-tw.ctb
?6、查找/etc目錄下所有用戶都沒有寫權限的文件
[root@Centos7 shells]# find /etc/ -not -perm /222 -ls 67378566 196 -r--r--r-- 1 root root 198453 Jul 21 11:23 /etc/pki/ca-trust/extracted/java/cacerts 134606432 352 -r--r--r-- 1 root root 359773 Jul 21 11:23 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt 201787858 264 -r--r--r-- 1 root root 266702 Jul 21 11:23 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem 201787859 216 -r--r--r-- 1 root root 217510 Jul 21 11:23 /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem 201787860 208 -r--r--r-- 1 root root 211626 Jul 21 11:23 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem 631373 4 -r-------- 1 root root 45 Jul 21 11:24 /etc/openldap/certs/password 68464198 4 -r--r--r-- 1 root root 531 Sep 6 2015 /etc/lvm/profile/cache-mq.profile 68464199 4 -r--r--r-- 1 root root 338 Sep 6 2015 /etc/lvm/profile/cache-smq.profile 68464200 4 -r--r--r-- 1 root root 2249 Nov 21 2015 /etc/lvm/profile/command_profile_template.profile 68464201 4 -r--r--r-- 1 root root 828 Nov 21 2015 /etc/lvm/profile/metadata_profile_template.profile 68464202 4 -r--r--r-- 1 root root 76 Sep 6 2015 /etc/lvm/profile/thin-generic.profile 68464203 4 -r--r--r-- 1 root root 80 Sep 6 2015 /etc/lvm/profile/thin-performance.profile 203877169 4 -r--r--r-- 1 root root 460 Nov 20 2015 /etc/dbus-1/system.d/cups.conf 136828869 4 ---------- 1 root root 1183 Aug 12 12:47 /etc/gshadow 134996892 4 ---------- 1 root root 1197 Aug 12 12:47 /etc/gshadow- 136828764 4 ---------- 1 root root 2087 Aug 12 12:47 /etc/shadow 68500289 4 -r--r--r-- 1 root root 63 Nov 20 2015 /etc/ld.so.conf.d/kernel-3.10.0-327.el7.x86_64.conf 134997273 4 ---------- 1 root root 2119 Aug 12 12:47 /etc/shadow- 206290485 6852 -r--r--r-- 1 root root 7014922 Jul 21 11:37 /etc/udev/hwdb.bin 134997540 4 -r--r--r-- 1 root root 33 Jul 21 11:25 /etc/machine-id 68582624 4 -r--r--r-- 1 root root 146 Nov 20 2015 /etc/pam.d/cups 136634061 8 -r--r----- 1 root root 4188 Jul 7 2015 /etc/sudoers
?7、查找/etc目錄下至少有一類用戶沒有執行權限的文件
[root@Centos7 test]# find /etc -not -perm -111 -ls | wc -l 1891
?8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件
[root@Centos7 shells]# find /etc/init.d -perm -111 -a -perm -002 -ls 134514558 0 lrwxrwxrwx 1 root root 11 Jul 21 11:23 /etc/init.d -> rc.d/init.d
二、博客:
德·摩根定律
非(P 且Q) = (非P) 或(非Q)
非(P 或Q) = (非P) 且(非Q)
三、預習
原創文章,作者:麥德良,如若轉載,請注明出處:http://www.www58058.com/34861