LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1432|回复: 20

home_king: "一个删除无效链接的脚本" 疑问

[复制链接]
发表于 2004-4-13 18:42:03 | 显示全部楼层 |阅读模式
home_king 兄:
你是如何判断一个 symbolic link 无效的?
发表于 2004-4-13 19:15:08 | 显示全部楼层
ls -i filename不就可以看出这个链接是否有效的么?
 楼主| 发表于 2004-4-13 19:45:53 | 显示全部楼层
home_king 用的是 [ ! -s file ],不很明白其道理
发表于 2004-4-13 20:01:17 | 显示全部楼层
最初由 dearvoid 发表
home_king 用的是 [ ! -s file ],不很明白其道理

用-s file来判断链接,我想不太恰当,;)因为会有跟多文件是空的!还是听听我们教主的高见吧
发表于 2004-4-13 20:29:21 | 显示全部楼层

这样也可以删除一些无效链接

  1. find /dirpath -type l -exec file {} \;|awk -F: '/broken symbolic/{pritn $1}'|xargs rm
复制代码
发表于 2004-4-14 07:31:09 | 显示全部楼层
这样也可以删除一些无效链接    源码:  find /dirpath -type l -exec file {} \;|awk -F: '/broken symbolic/{pritn $1}'|xargs rm


COOL!
发表于 2004-4-14 09:12:21 | 显示全部楼层
解决一个任务的方法有很多,这个是必然的。就像以前777兄以及现在javalee兄的脚本,它们都能在大多数情况下解决问题。但是,正如我一直所强调的,代码需要强壮性,这个概念不仅是高级语言要遵守,shell代码也同样不例外。
777兄分析ls的结果来判断软链接的有效性,这对于Linux大多数发行版本而言结果是正确的,但对于Unix变种甚至一些发行版本(不同的ls)是走不通的,因为777兄分析的条件是固定的域位置。
至于javalee兄的脚本,它使用file。注意,file可能存在同样的移植问题,它在不同的机器上出错表示可能是不一样的。(这里强调的是可能,因为file是外部命令)。

我个人的意见是,最好使用bash内置的功能来完成任务。众所周知,shell是最具移植性的,它的状态在各系统上保持了最大的一致性。这样一来,强壮性就得到了最大的保证。
请看我的脚本的代码片断:

  1. ...
  2. linklist=$(find $1 -${DEPTH:-"depth"} -type l |xargs)
  3. for i in $linklist; do
  4.      [ ! -s $i ] && rm -${INTERACTIVE:-"i"} $i
  5. done
  6. ...
复制代码

1. javalee兄提及"用-s file来判断链接,我想不太恰当,因为会有跟多文件是空的"
注意,我是在用find命令后使用test的,也就是说,test的对象是链接文件。再者,一个软链接的目标文件消失后,与目标文件存在相比,-s的返回值不同。
2. test是bash内置命令,所以它的移植性能最好,脚本的强壮性也同时提升了。

个人意见,仅供参考。
发表于 2004-4-14 11:56:24 | 显示全部楼层
home_king兄,如果我用5%的精力却要去完美的实现工作中1%的非重要事件会不会太过分了?
我们的确要注意代码的可移值性,但是在大多数情况下不用进行如此大范围的考虑,当然此类概念还是必须记在心里,该用时才用。
发表于 2004-4-14 12:01:09 | 显示全部楼层
最初由 cx6445 发表
home_king兄,如果我用5%的精力却要去完美的实现工作中1%的非重要事件会不会太过分了?
我们的确要注意代码的可移值性,但是在大多数情况下不用进行如此大范围的考虑,当然此类概念还是必须记在心里,该用时才用。

那你又把这你认为很昂贵的5%的时间花费在什么地方呢?花费在上网聊天,还是什么别的。

写严谨的代码就应该从小事做起,培养习惯,不然编写大型项目的时候,这些所谓的%1的非重要事件就会使你的代码100%地变成废物。

在下一向直言直说,得罪之处,请兄弟包涵。
 楼主| 发表于 2004-4-14 12:21:09 | 显示全部楼层
最初由 home_king 发表
注意,我是在用find命令后使用test的,也就是说,test的对象是链接文件。再者,一个软链接的目标文件消失后,与目标文件存在相比,-s的返回值不同。

还是不懂:
  1. -(root@daisy)--(~/trash)-
  2. [1444 0] % l bar foo
  3. /bin/ls: bar: No such file or directory
  4. /bin/ls: foo: No such file or directory
  5. -(root@daisy)--(~/trash)-
  6. [1444 1] % touch foo
  7. -(root@daisy)--(~/trash)-
  8. [1444 0] % ln -s foo bar
  9. -(root@daisy)--(~/trash)-
  10. [1444 0] % l bar foo   
  11. lrwxrwxrwx    1 root     root            3 Apr 14 12:16 bar -> foo
  12. -rw-r--r--    1 root     root            0 Apr 14 12:16 foo
  13. -(root@daisy)--(~/trash)-
  14. [1444 0] % [ -s bar ]
  15. -(root@daisy)--(~/trash)-
  16. [1444 1] % echo $?
  17. [color=red]1[/color]
  18. -(root@daisy)--(~/trash)-
  19. [1444 0] % rm -f foo
  20. -(root@daisy)--(~/trash)-
  21. [1444 0] % [ -s bar ]
  22. -(root@daisy)--(~/trash)-
  23. [1444 1] % echo $?   
  24. [color=red]1[/color]
  25. -(root@daisy)--(~/trash)-
  26. [1444 0] % find -type l -name bar
  27. ./bar
  28. -(root@daisy)--(~/trash)-
  29. [1444 0] %
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表