发布于2026-06-29 阅读(0)
扫一扫,手机访问
在日常使用Linux的过程中,符号链接是管理文件的利器——把常用文件或程序链接到桌面,省去了反复切换目录的麻烦。不过便利背后也有个小烦恼:一旦源文件被删除,那些符号链接就成了“断线”的孤儿,散落在文件夹里,既占位置又碍眼。手动一条条确认再删除?费时费力。能不能写个脚本自动清理这些失效的符号链接?答案就在下面。

这个脚本专门用来找那些指向已不存在文件的符号链接,并且能输出它们的目标路径,方便你直接交给 xargs rm 处理。比如这样用:
#!/bin/bash
# 一个可以测试链接断掉的符号链接的文件,并且可以输出它们指向的文件
# 以便于它们可以把输出提供给xargs来进行处理 :)
# 比如. broken-link.sh /somedir /someotherdir|xargs rm
#
#下边的方法, 不管怎么说, 都是一种更好的办法:
#
#find "somedir" -type l -print0|
#xargs -r0 file|
#grep "broken symbolic"|
#sed -e 's/^|: *broken symbolic.*$/"/g'
#
#但这不是一个纯粹的bash脚本, 最起码现在不是.
#注意: 谨防在/proc文件系统和任何死循环链接中使用!
##############################################################
#如果没有参数被传递到脚本中, 那么就使用
#当前目录. 否则就是用传递进来的参数作为目录
#来搜索.
####################
[ $# -eq 0 ] && directorys=`pwd` || directorys=$@
#编写函数linkchk用来检查传递进来的目录或文件是否是链接,
#并判断这些文件或目录是否存在. 然后打印它们所指向的文件.
#如果传递进来的元素包含子目录,
#那么把子目录也放到linkcheck函数中处理, 这样就达到了递归的目的.
##########
linkchk () {
for element in $1/*; do
[ -h "$element" -a ! -e "$element" ] && echo "$element"
[ -d "$element" ] && linkchk $element
# 当然, '-h'用来测试符号链接, '-d'用来测试目录.
done
}
#把每个传递到脚本的参数都送到linkchk函数中进行处理,
#检查是否有可用目录. 如果没有, 那么就打印错误消息和
#使用信息.
################
for directory in $directorys; do
if [ -d $directory ]
then linkchk $directory
else
echo "$directory is not a directory"
echo "Usage: $0 dir1 dir2 ..."
fi
done
exit 0
下面用一个简单的例子演示它的工作流程。先创建一个文件 name,再为它建一个符号链接 aaa。
andrew@andrew:/work/bash/src$ touch name andrew@andrew:/work/bash/src$ ln -s name aaa
然后删除原始文件 name,这时 aaa 就成了一个“失效”的符号链接。
andrew@andrew:/work/bash/src$ rm name
用 ls -l 查看,会发现 aaa -> name 还在,但指向的文件已经不在了。
andrew@andrew:/work/bash/src$ ls -l 总用量 44 lrwxrwxrwx 1 andrew andrew 4 2月 1 13:20 aaa -> name -rwxrwxr-x 1 andrew andrew 8656 1月 30 14:46 a.out -rw-rw-r-- 1 andrew andrew 1887 2月 1 13:08 broken_link.sh -rw-rw-r-- 1 andrew andrew 322 1月 29 13:08 echo_unique.sh -rw-rw-r-- 1 andrew andrew 1513 1月 29 15:55 escape_charater.sh -rw-rw-r-- 1 andrew andrew 279 1月 30 13:48 exit_example.sh -rw-rw-r-- 1 andrew andrew 199 2月 1 11:52 if_else_more.sh -rw-rw-r-- 1 andrew andrew 1946 1月 30 21:03 if_true.sh -rw-rw-r-- 1 andrew andrew 337 1月 29 14:02 single_quotation_mark.sh -rw-rw-r-- 1 andrew andrew 864 2月 1 12:00 test.c
最后调用脚本,把结果通过管道传给 xargs rm,一键清除这些残存的符号链接。
andrew@andrew:/work/bash/src$ bash broken_link.sh ./ | xargs rm andrew@andrew:/work/bash/src$ ls -l 总用量 44 -rwxrwxr-x 1 andrew andrew 8656 1月 30 14:46 a.out -rw-rw-r-- 1 andrew andrew 1887 2月 1 13:08 broken_link.sh -rw-rw-r-- 1 andrew andrew 322 1月 29 13:08 echo_unique.sh -rw-rw-r-- 1 andrew andrew 1513 1月 29 15:55 escape_charater.sh -rw-rw-r-- 1 andrew andrew 279 1月 30 13:48 exit_example.sh -rw-rw-r-- 1 andrew andrew 199 2月 1 11:52 if_else_more.sh -rw-rw-r-- 1 andrew andrew 1946 1月 30 21:03 if_true.sh -rw-rw-r-- 1 andrew andrew 337 1月 29 14:02 single_quotation_mark.sh -rw-rw-r-- 1 andrew andrew 864 2月 1 12:00 test.c
总结
这个脚本的核心思路就是遍历指定目录下的所有条目,用 -h 检测符号链接,再用 -e 判断目标文件是否存在,两条件一组合,失效链接就被拎出来了。配合 xargs rm 就能批量清理,省去手工检查的麻烦。在实际使用中,建议先不加 | xargs rm 跑一遍看看输出,确认没问题再真正执行删除。毕竟,万一误删了还在使用的链接,恢复起来可就不那么愉快了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8