查找目录树中指向该树外部的所有符号链接

查找目录树中指向该树外部的所有符号链接

我经常将目录树移动到其他位置或将其 tarball 复制到其他计算机,并且我希望有一种方法来检查目录树中是否有符号链接A指向外部的位置A因为这些将在移动/复制的目录中被破坏。

答案1

您想要一个名为 的程序realpath,与 一起使用find

例如:

find . -type l -exec realpath {} \; | grep -v "^$(pwd)"

答案2

使用绑定文件系统创建该目录树的另一个视图。

mkdir /tmp/view
bindfs /some/directory /tmp/view

然后使用符号链接实用程序(由许多发行版提供,或者从来源)来检测跨文件系统链接。

symlinks -r /tmp/view | sed -n 's/^\(absolute\|other_fs\): //p'

(请注意,解析输出假定您的符号链接及其目标不包含换行符,符号链接的路径也不包含子字符串 -> 。)相同的实用程序还可以将绝对符号链接转换为相对符号链接(但您希望从原来的位置)。

答案3

使用 zsh:

cd -P -- "$dir"
for i (**/*(ND@)) [[ $i:A = $PWD/* ]] || [[ $i:A = $PWD ]] || print -r -- "$i => $i:A"

现在,如果目录是/foo并且您有/foo/bar一个到 的符号链接/foo/baz,则该链接的目标位于 /foo 中,但一旦移动,该链接仍然会被破坏,因此您可能还希望将符号链接与绝对路径匹配。

但即便如此,bar => ../foo/bazin/foo也会是一个问题(误报),因此,a => bwhereb是树外部的符号链接(误报,取决于您想要如何看待它)

答案4

GNU coreutilsprovedes realpath,它解析符号链接。这样,您可以将每个符号链接的目标与当前工作目录进行比较,如下所示:

#!/bin/bash

find . | while read filename
do
  if realpath $filename | grep -E "^$PWD" > /dev/null
  then
    echo 'this file is safe'
  else
    echo 'this file links externally'
  fi
done

相关内容