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


8

我经常移动的目录树到其他地点或他们的tar文件拷贝到其他机器,我想必须检查是否在目录树中的任何符号链接的方法到驻地以外的点一个,因为这些将在移动破碎/复制目录。

Answers:


7

您需要一个realpath与结合使用的名为的程序find

例如:

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

1
您提供的咒语仅报告有问题的目标位置,而不报告指向该目标位置的符号链接。因此,我已经取消了接受。请在下面查看我的“答案”:unix.stackexchange.com/a/308899/24044,如果您对此感到满意(或对其进行了改进),我将删除我的“答案”并再次接受您的问题。
马库斯·朱尼乌斯·布鲁图斯

2

使用bindfs创建该目录树的另一个视图。

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

然后使用symlinks实用程序(由许多发行版提供,或从source编译)来检测跨文件系统链接。

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

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


2

使用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 => b哪里b(假阳性,取决于您如何看待它)


2

我必须调整@bahamat给出的答案以使其起作用。

提供的版本仅报告了有问题的绝对位置,但没有报告指向该位置的符号链接。

这是我使用的(我敢肯定它可以改善):

for f in $(find . -type l ); do echo -n $(realpath $f) && echo -n "|" && echo $f ; done | grep -v "^$(pwd)" | cut -d \| -f 2 

我发现这是最有用的脚本:(for f in $(find . -type l); do echo $(realpath -m -q $f) '<-' $f; done | grep-v "^$(pwd)"最著名的是-m-q它过滤掉了损坏的和非外部的链接)
Adam Lindberg,2017年

1

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

几个问题:没有-type l,没有-r选项read,IFS不消毒的read$filename没有报价,$PWD为正则表达式处理,用换行符路径不入账,/foobar将匹配的$PWD“/ foo”的==
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.