答案 0 :(得分:85)
这是一种POSIX方法,可以删除当前目录中所有已损坏的符号链接,而不进行递归。它的工作原理是告诉find
遍历符号链接(-L
),但在每个目录或符号链接上停止(-prune
)。
find -L . -name . -o -type d -prune -o -type l -exec rm {} +
您也可以使用shell循环。测试-L
匹配符号链接,-e
匹配现有文件(不包括损坏的符号链接)。
for x in * .[!.]* ..?*; do if [ -L "$x" ] && ! [ -e "$x" ]; then rm -- "$x"; fi; done
如果要递归到子目录,这种技术不起作用。使用GNU find(在非嵌入式Linux和Cygwin上找到),您可以使用-xtype
谓词来检测损坏的符号链接(-xtype
使用符号链接的目标类型,并报告{{ 1}}用于断开的链接。)
l
POSIXly,你需要结合两个工具。您可以使用find -xtype l -delete
在每个符号链接上调用命令,并使用find -type l -exec …
来测试该链接是否未被破坏。
[ -e "$x" ]
最简单的解决方案是使用zsh。删除当前目录中所有损坏的符号链接:
find . -type l -exec sh -c 'for x; do [ -e "$x" ] || rm "$x"; done' _ {} +
括号中的字符为glob qualifiers:rm -- *(-@D)
取消引用符号链接,-
仅匹配符号链接(组合@
仅表示已损坏的符号链接),{{1匹配点文件。要递归到子目录,请设置-@
。
答案 1 :(得分:18)
基于您链接的答案(对于给定目录$DIR
)的简单答案:
find -L $DIR -maxdepth 1 -type l -delete
答案 2 :(得分:6)
来自man find
示例:
find -L /usr/ports/packages -type l -exec rm -- {} +
删除/ usr / ports / packages中所有损坏的符号链接。
答案 3 :(得分:5)
根据问题"How can I find broken symlinks"的接受答案回答:
find . -type l -! -exec test -e {} \; -print | xargs rm
答案 4 :(得分:5)
对于 MAC ,按如下方式进行干运行: -
DIR=<some path>
find -L $DIR -maxdepth 1 -type l -print
现在,您可以按如下方式修剪旧的符号链接: -
for f in `find -L $DIR -maxdepth 1 -type l`; do unlink $f; done
答案 5 :(得分:2)
软件包symlinks
预先安装在许多发行版上(包括Ubuntu 16.04和Fedora 25),并且有一些非常有用的功能,其中一个正是您正在寻找的内容:
var linkHome;
document.getElementById("form1").onsubmit = function validateform() {
var uid = document.getElementById("form1").elements[0].value;
var pwd = document.getElementById("form1").elements[1].value;
if (uid === "admin" && pwd === "admin") {
document.getElementById("demo1").innerHTML = "Found elements in the form.";
linkHome = "/MenuDemo1/src/adminHome.jsp";
} else {
linkHome = "/MenuDemo1/src/userHome.jsp";
}
location.href = linkHome;
return false;
}
答案 6 :(得分:1)
您可以使用readlink
来确定符号链接是否已损坏。
以下列出了给定目录(和子目录)中所有损坏的符号链接:
find . -type l -exec sh -c 'readlink -f "{}" 1>/dev/null || echo "{}"' -- "{}" \;
将echo
替换为rm
以摆脱破碎的!{/ p>
(我已将readlink
的输出重定向到/dev/null
,以避免混淆;它会列出符号链接的目标。)
答案 7 :(得分:0)
您可以尝试使用rmlint。
首先,将目录更改为包含损坏的符号链接的文件夹,然后 运行以下命令以查找指向哪里的错误符号链接:
rmlint --types="badlinks"
然后rmlint
将在当前目录中创建一个bash脚本rmlint.sh
,并在终端中打印一个错误的符号链接列表。要删除当前目录中的所有错误符号链接,可以运行
./rmlint.sh
不完全是一个衬垫,但它非常容易使用。