用一行删除所有破损的符号链接?

时间:2014-02-28 13:56:13

标签: bash shell unix symlink

对于给定的文件夹,如何删除其中所有已损坏的链接?

我发现this answer显示了如何删除一个断开的链接,但我不能将它们放在一行中。这是否有单线?

符号断开是指向不再存在的文件/文件夹的链接。

8 个答案:

答案 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 qualifiersrm -- *(-@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

不完全是一个衬垫,但它非常容易使用。