Gil*_*il' 95
这是一种POSIX方法,可以删除当前目录中所有已损坏的符号链接,而不进行递归.它通过告诉find
遍历符号链接(-L
),但-prune
在每个目录或符号链接到这样的停止().
find -L . -name . -o -type d -prune -o -type l -exec rm {} +
Run Code Online (Sandbox Code Playgroud)
您也可以使用shell循环.该测试-L
与符号链接匹配,并-e
匹配现有文件(不包括损坏的符号链接).
for x in * .[!.]* ..?*; do if [ -L "$x" ] && ! [ -e "$x" ]; then rm -- "$x"; fi; done
Run Code Online (Sandbox Code Playgroud)
如果要递归到子目录,这种技术不起作用.使用GNU find(在非嵌入式Linux和Cygwin上找到),您可以使用-xtype
谓词来检测损坏的符号链接(-xtype
使用符号链接的目标类型和l
断开链接的报告).
find -xtype l -delete
Run Code Online (Sandbox Code Playgroud)
POSIXly,您需要结合两个工具.您可以使用find -type l -exec …
在每个符号链接上调用命令,并[ -e "$x" ]
测试该链接是否未破坏.
find . -type l -exec sh -c 'for x; do [ -e "$x" ] || rm "$x"; done' _ {} +
Run Code Online (Sandbox Code Playgroud)
最简单的解决方案是使用zsh.要删除当前目录中所有损坏的符号链接:
rm -- *(-@D)
Run Code Online (Sandbox Code Playgroud)
括号中的字符是glob限定符:-
取消引用符号链接,@
仅匹配符号链接(组合-@
仅表示损坏的符号链接),以及D
匹配点文件.要递归到子目录,请进行rm -- **/*(-@D)
.
san*_*uel 20
基于您链接的答案(对于给定目录$DIR
)的简单答案:
find -L $DIR -maxdepth 1 -type l -delete
Run Code Online (Sandbox Code Playgroud)
从man find
示例:
find -L /usr/ports/packages -type l -exec rm -- {} +
Run Code Online (Sandbox Code Playgroud)
删除/ usr/ports/packages中所有损坏的符号链接.
对于MAC,请执行以下空运行:
DIR=<some path>
find -L $DIR -maxdepth 1 -type l -print
Run Code Online (Sandbox Code Playgroud)
现在,您可以修剪旧的符号链接,如下所示:
for f in `find -L $DIR -maxdepth 1 -type l`; do unlink $f; done
Run Code Online (Sandbox Code Playgroud)
根据问题"如何找到损坏的符号链接"的接受答案回答:
find . -type l -! -exec test -e {} \; -print | xargs rm
Run Code Online (Sandbox Code Playgroud)
该软件包symlinks
已预安装在许多发行版(包括 Ubuntu 16.04 和 Fedora 25)上,并且具有一些非常有用的功能,其中之一正是您正在寻找的功能:
symlinks -d ./
Run Code Online (Sandbox Code Playgroud)
-d == delete dangling links
Run Code Online (Sandbox Code Playgroud)