そのツリーの外を指しているディレクトリツリー内のすべてのシンボリックリンクを見つける


8

私は頻繁に他の場所にディレクトリツリーを移動したり、他のマシンに自分のtarballをコピーし、私は、ディレクトリツリー内のすべてのシンボリックリンクかどうかを確認する方法がしたいAのの場所の外部にポイントAをこれらが移動/コピーに分割されますので、ディレクトリ。

回答:


7

realpathと組み合わせて使用​​すると呼ばれるプログラムが必要ですfind

例えば:

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

1
あなたが提供する呪文は、問題のターゲット位置を報告するだけで、それを指すシンボリックリンクは報告しません。そのようなものとして、私は私の受け入れを取り除きました。以下の私の「回答」を参照してください:unix.stackexchange.com/a/308899/24044そして、それでよければ(または改善してください)、私の「回答」を削除して、もう一度質問を受け入れます。
Marcus Junius Brutus

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 => bwhere 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壊れたリンクと外部以外のリンクを除外します)
アダムリンドバーグ

1

GNU coreutilsは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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.