1 #!/bin/bash
2 # broken-link.sh
3 # 由Lee bigelow所写<
[email protected]>
4 # 已经征得作者的同意.
5
6 #一个用于发现死符号链接并且输出它们的链接文件的纯shell的脚本。
7 #所以它们能把输出提供给xargs并处理
8 #例如: broken-link.sh /somedir /someotherdir|xargs rm
9 #
10 #下面是更好的发现死符号链接的办法:
11 #
12 #find "somedir" -type l -print0|\
13 #xargs -r0 file|\
14 #grep "broken symbolic"|
15 #sed -e 's/^\|: *broken symbolic.*$/"/g'
16 #
17 #但这不是纯bash脚本,下面的则是.
18 #注意: 谨防在/proc文件系统和死循环链接中使用!
19 ##############################################################
20
21
22 #如果没有参数被传递给脚本作为搜索目录,则使用当前目录
23 #
24 #
25 ####################
26 [ $# -eq 0 ] && directorys=`pwd` || directorys=$@
27
28 #Setup the function linkchk to check the directory it is passed
29 #for files that are links and don't exist, then print them quoted.
30 #If one of the elements in the directory is a subdirectory then
31 #send that send that subdirectory to the linkcheck function.
32 ##########
33 linkchk () {
34 for element in $1/*; do
35 [ -h "$element" -a ! -e "$element" ] && echo \"$element\"
36 [ -d "$element" ] && linkchk $element
37 # Of course, '-h' tests for symbolic link, '-d' for directory.
38 done
39 }
40
41 #Send each arg that was passed to the script to the linkchk function
42 #if it is a valid directoy. If not, then print the error message
43 #and usage info.
44 ################
45 for directory in $directorys; do
46 if [ -d $directory ]
47 then linkchk $directory
48 else
49 echo "$directory is not a directory"
50 echo "Usage: $0 dir1 dir2 ..."
51 fi
52 done
53
54 exit 0