《Advanced Bash-scripting Guide》學習(十五):測試壞的連結檔案(broken link),
本文所選的例子來自於《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 #12321 #echo 123:abcthisthisthis | sed -e 's/|:.*this.*/''/g'22 #123 注意兩者的區別,即":"後有無"."23 24 方法二:25 #!/bin/bash26 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 do45 if [ -h "$i" -a ! -e "$i" ] 46 then47 echo "$i" 48 elif [ -d "$i" ] 49 then 50 linkchk "$i"51 fi 52 done53 }54 55 #linkchk()是一個自訂的函數,$directory是這個函數中傳入的第一個位置參數56 for directory in $directorys57 do58 if [ -d $directory ] 59 then 60 linkchk $directory 61 else 62 echo "$directory is not a directory" 63 echo "Usage: $0 dir1 dir2 ..." 64 fi65 done66 67 exit 0
指令碼運行結果