本文所選的例子來自於《Advanced Bash-scripting Gudie》一書,譯者 楊春敏 黃毅 腳本運行結果 ...
本文所選的例子來自於《Advanced Bash-scripting Gudie》一書,譯者 楊春敏 黃毅
1 #/bin/bash 2 #用一個純粹的shell腳本來找出壞鏈接文件 3 #什麼是broken link?對於符號鏈接(軟鏈接),如果先刪除原文件,則會成為壞鏈接(broken link) 4 5 方法一 6 find "somedir" -type l -print0 | xargs -r0 file | grep "broken symbolic" | sed -e 's/^\|: *broken symbolic.*$/''/g' 7 #這並不是一個純粹的shell腳本 8 #-type l 文件類型為符號鏈接的文件 9 #file命令用來識別文件類型,也可用來辨別一些文件的編碼格式 10 #如果文件是“broken link",那麼find . -type l -print0 | xargs -r0 file執行後就會顯示如下:./yum.log.soft: broken symbolic link to `/tmp/yum.log' 11 12 #\| 是一個出現在樣式內部並經過轉義的定界符 13 #當定界符號出現在樣式內部時,我們必須用首碼\對它進行轉義 14 #sed 's:text:replace:g' 15 #sed 's|text|replace|g' 16 #sed 's|te\|xt|replace|g' 17 18 #例子: 19 #echo 123:thisthisthis | sed -e 's/^\|:*this.*$/''/g' 20 #123 21 #echo 123:abcthisthisthis | sed -e 's/|:.*this.*/''/g' 22 #123 註意兩者的區別,即":"後有無"." 23 24 方法二: 25 #!/bin/bash 26 27 #檢查目錄是否傳入參數,如果沒有傳入參數,就以當前目錄作為搜索目錄, 28 #如果有傳入的參數,以傳入參數的目錄作為搜索目錄 29 # 其實這個$@是不可以改成$1的,有很多位置參數的情況還是存在的,換成$1只對第一個位置參數有效 30 if [ $# -eq 0 ] 31 then 32 directorys=`pwd` 33 else 34 directorys=$@ 35 fi 36 37 #$1指的就是$directory,第一個位置參數,$1/*指的是$1下所有的目錄和文件 38 #這部分主要針對目錄下的目錄而言,如果$directory下還有一個目錄,那麼把整個目錄作為位置參數傳入linkchk函數,如果下麵還有,再作為位置參數傳入,這是遞歸的 39 #-h 檢查符號鏈接文件是否存在(存在為真),! -e 檢查文件是否不存在(不存在為真),這兩個同時要成立是不是前後矛盾? 40 #經檢查,發現不是這樣,cat 壞鏈接名,會提示沒有那個文件或目錄,說明鏈接文件指向的原文件的值已不存在,其屬性還在 41 linkchk() 42 { 43 for i in $1/* 44 do 45 if [ -h "$i" -a ! -e "$i" ] 46 then 47 echo "$i" 48 elif [ -d "$i" ] 49 then 50 linkchk "$i" 51 fi 52 done 53 } 54 55 #linkchk()是一個自定義的函數,$directory是這個函數中傳入的第一個位置參數 56 for directory in $directorys 57 do 58 if [ -d $directory ] 59 then 60 linkchk $directory 61 else 62 echo "$directory is not a directory" 63 echo "Usage: $0 dir1 dir2 ..." 64 fi 65 done 66 67 exit 0
腳本運行結果