GNU/Linux >> Linux の 問題 >  >> Linux

シンボリック リンク チェーンを一覧表示するには?

解決策 1:

namei を使用するだけです :

$ namei d
f: d
 l d -> c
   l c -> b
     l b -> a
       d a

解決策 2:

readlink -e <link>

<ブロック引用>

readlink [オプション]... ファイル

  • -e, --canonicalize-existing
    指定された名前のすべてのコンポーネントのすべてのシンボリック リンクを再帰的にたどって正規化します。すべてのコンポーネントが存在する必要があります
$ mkdir testlink
$ cd testlink
[email protected]:~/testlink$ ln -s c b
[email protected]:~/testlink$ ln -s b a
[email protected]:~/testlink$ ls -l 
total 0
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c
[email protected]:~/testlink$ echo foo > c
[email protected]:~/testlink$ cat a
foo
[email protected]:~/testlink$ readlink -e a
/home/pjb/testlink/c

注:readlink a 自体は b を返します

注 #2:find -l と一緒に、チェーンを一覧表示するユーティリティは perl で簡単に記述できますが、ループを検出するのに十分スマートでなければなりません

ループがある場合、 readlink は何も出力しません。これは立ち往生するよりはましだと思います。

[email protected]:~/testlink$ ln -sf a c
[email protected]:~/testlink$ ls -l 
total 0
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:03 c -> a
[email protected]:~/testlink$ readlink -e a
[email protected]:~/testlink$ # (note: no output)

解決策 3:

Bash の再帰関数は次のとおりです。

chain() { export chain; local link target; if [[ -z $chain ]]; then chain="$1"; fi; link=$(stat --printf=%N $1); while [[ $link =~ \-\> ]]; do target="${link##*\`}"; target="${target%\'}"; chain+=" -> $target"; chain "$target"; return; done; echo "$chain"; unset chain; }

複数行:

chain() {
    export chain
    local link target
    if [[ -z $chain ]]
    then
        chain="$1"
    fi
    link=$(stat --printf=%N "$1")
    while [[ $link =~ \-\> ]]
    do
        target="${link##*\`}"
        target="${target%\'}"
        chain+=" -> $target"
        if [[ ! $target =~ / && $1 =~ / ]]
        then
            target="${1%/*}/$target"
        fi
        chain "$target"
        return
    done
    echo "$chain"
    unset chain
}

例:

$ chain d
d -> c -> b -> a
$ chain c
c -> b -> a
$ chain a
a

stat(1) が必要です 一部のシステムには存在しない場合があります。

名前にバッククォート、一重引用符、または "->" が含まれていると失敗します。 symlink ループでループに陥ります (これは、Bash 4 の連想配列を使用して解決できます)。既に使用されているかどうかに関係なく、「チェーン」と呼ばれる変数をエクスポートします。

他の問題があるかもしれません。

編集:

いくつかの相対シンボリック リンクの問題を修正しました。一部はまだ機能しませんが、以下のバージョンではリンクのターゲットが存在する必要はありません。

readlink を使用するバージョンを追加:

chain ()
{
    export chain;
    local target;
    if [[ -z $chain ]]; then
        chain="$1";
    fi;
    target=$(readlink "$1");
    while [[ $target ]]; do
        chain+=" -> $target";
        if [[ ! $target =~ / && $1 =~ / ]]
        then
            target="${1%/*}/$target"
        fi
        chain "$target";
        return;
    done;
    echo "$chain";
    unset chain
}

Linux
  1. Linuxでハードリンクとシンボリックリンクを作成する方法

  2. シンボリックリンクを圧縮するには?

  3. ディレクトリへのシンボリックリンクを削除するには?

  1. 相対シンボリック リンクを移動するにはどうすればよいですか?

  2. ディレクトリへのリンクを作成する方法

  3. シンボリック リンク libc.so.6 を削除した後に回復するにはどうすればよいですか?

  1. PostgreSQLですべてのデータベースを一覧表示する方法

  2. Lnコマンド:Linuxでシンボリックリンクを作成する方法

  3. LinuxSSコマンドの使用方法