《Advanced Bash-scripting Guide》学习(十五):测试坏的链接文件(broken link)


本文摘自PHP中文网,作者PHP中文网,侵删。

本文所选的例子来自于《Advanced Bash-scripting Gudie》一书,译者 杨春敏 黄毅

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

<span style="color: #008080"> 1</span> #/bin/<span style="color: #000000">bash

</span><span style="color: #008080"> 2</span> <span style="color: #000000">#用一个纯粹的shell脚本来找出坏链接文件

</span><span style="color: #008080"> 3</span> #什么是broken link?<span style="color: #000000">对于符号链接(软链接),如果先删除原文件,则会成为坏链接(broken link)

</span><span style="color: #008080"> 4</span>

<span style="color: #008080"> 5</span> <span style="color: #000000">方法一

</span><span style="color: #008080"> 6</span> <span style="color: #0000ff">find</span> <span style="color: #800000">"</span><span style="color: #800000">somedir</span><span style="color: #800000">"</span> -type l -print0 | <span style="color: #0000ff">xargs</span> -r0 <span style="color: #0000ff">file</span> | <span style="color: #0000ff">grep</span> <span style="color: #800000">"</span><span style="color: #800000">broken symbolic</span><span style="color: #800000">"</span> | <span style="color: #0000ff">sed</span> -e <span style="color: #800000">'</span><span style="color: #800000">s/^\|: *broken symbolic.*$/</span><span style="color: #800000">''</span><span style="color: #800000">/g</span><span style="color: #800000">'</span>

<span style="color: #008080"> 7</span> <span style="color: #000000">#这并不是一个纯粹的shell脚本

</span><span style="color: #008080"> 8</span> #-<span style="color: #000000">type l 文件类型为符号链接的文件

</span><span style="color: #008080"> 9</span> <span style="color: #000000">#file命令用来识别文件类型,也可用来辨别一些文件的编码格式

</span><span style="color: #008080">10</span> #如果文件是“broken link<span style="color: #800000">"</span><span style="color: #800000">,那么find . -type l -print0 | xargs -r0 file执行后就会显示如下:./yum.log.soft: broken symbolic link to `/tmp/yum.log'</span>

<span style="color: #008080">11</span>

<span style="color: #008080">12</span> #\|<span style="color: #000000"> 是一个出现在样式内部并经过转义的定界符

</span><span style="color: #008080">13</span> <span style="color: #000000">#当定界符号出现在样式内部时,我们必须用前缀\对它进行转义

</span><span style="color: #008080">14</span> #<span style="color: #0000ff">sed</span> <span style="color: #800000">'</span><span style="color: #800000">s:text:replace:g</span><span style="color: #800000">'</span>

<span style="color: #008080">15</span> #<span style="color: #0000ff">sed</span> <span style="color: #800000">'</span><span style="color: #800000">s|text|replace|g</span><span style="color: #800000">'</span>

<span style="color: #008080">16</span> #<span style="color: #0000ff">sed</span> <span style="color: #800000">'</span><span style="color: #800000">s|te\|xt|replace|g</span><span style="color: #800000">'</span>

<span style="color: #008080">17</span>

<span style="color: #008080">18</span> <span style="color: #000000">#例子:

</span><span style="color: #008080">19</span> #<span style="color: #0000ff">echo</span> <span style="color: #800080">123</span>:thisthisthis | <span style="color: #0000ff">sed</span> -e <span style="color: #800000">'</span><span style="color: #800000">s/^\|:*this.*$/</span><span style="color: #800000">''</span><span style="color: #800000">/g</span><span style="color: #800000">'</span>

<span style="color: #008080">20</span> #<span style="color: #800080">123</span>

<span style="color: #008080">21</span> #<span style="color: #0000ff">echo</span> <span style="color: #800080">123</span>:abcthisthisthis | <span style="color: #0000ff">sed</span> -e <span style="color: #800000">'</span><span style="color: #800000">s/|:.*this.*/</span><span style="color: #800000">''</span><span style="color: #800000">/g</span><span style="color: #800000">'</span>

<span style="color: #008080">22</span> #<span style="color: #800080">123</span>                注意两者的区别,即<span style="color: #800000">"</span><span style="color: #800000">:</span><span style="color: #800000">"</span>后有无<span style="color: #800000">"</span><span style="color: #800000">.</span><span style="color: #800000">"</span>

<span style="color: #008080">23</span>

<span style="color: #008080">24</span> <span style="color: #000000">方法二:

</span><span style="color: #008080">25</span> #!/bin/<span style="color: #000000">bash

</span><span style="color: #008080">26</span>

<span style="color: #008080">27</span> <span style="color: #000000">#检查目录是否传入参数,如果没有传入参数,就以当前目录作为搜索目录,

</span><span style="color: #008080">28</span> <span style="color: #000000">#如果有传入的参数,以传入参数的目录作为搜索目录

</span><span style="color: #008080">29</span> <span style="color: #000000"># 其实这个$@是不可以改成$1的,有很多位置参数的情况还是存在的,换成$1只对第一个位置参数有效

</span><span style="color: #008080">30</span> <span style="color: #0000ff">if</span> [ $# -eq <span style="color: #800080">0</span><span style="color: #000000"> ]

</span><span style="color: #008080">31</span> <span style="color: #0000ff">then</span>

<span style="color: #008080">32</span>    directorys=`<span style="color: #0000ff">pwd</span><span style="color: #000000">`

</span><span style="color: #008080">33</span> <span style="color: #0000ff">else</span>

<span style="color: #008080">34</span>    directorys=<span style="color: #000000">$@

</span><span style="color: #008080">35</span> <span style="color: #0000ff">fi</span>

<span style="color: #008080">36</span>

<span style="color: #008080">37</span> #$1指的就是$directory,第一个位置参数,$<span style="color: #800080">1</span><span style="color: #000000">/*指的是$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</span>

脚本运行结果

 

以上就是《Advanced Bash-scripting Guide》学习(十五):测试坏的链接文件(broken link)的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

介绍beego、nginx性能测试实例

centos如何测试端口是否打开

linux终极渗透测试命令总结

Advanced bash-scripting guide》学习(十五):测试坏的链接文件(broken link)

Advanced bash-scripting guide》学习(十八):[[ ]]与[ ]的一些特殊情况

Advanced bash-scripting guide》学习(十七):用more来查看gzip文件

linux终极渗透测试命令总结

两个整数的最大公约数怎么实现的?

本地安装webbench步骤

Advanced bash-scripting guide》学习(十八):[[ ]]与[ ]的一些特殊情况

更多相关阅读请进入《Advanced》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...