ホームページ >運用・保守 >Linuxの運用と保守 >「上級 Bash スクリプト ガイド」学習 (15): リンク切れファイルのテスト (リンク切れ)

「上級 Bash スクリプト ガイド」学習 (15): リンク切れファイルのテスト (リンク切れ)

PHP中文网
PHP中文网オリジナル
2017-07-10 18:16:102178ブラウズ

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

<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>

脚本运行结果

 

以上が「上級 Bash スクリプト ガイド」学習 (15): リンク切れファイルのテスト (リンク切れ)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。