コマンドライン経由でシンボリックリンクターゲットを見つける


130

シンボリックリンクを設定するとします。

ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt

ターゲットがmyothertextfile.txtコマンドラインを使用しているものを確認する方法はありますか?

回答:


171

-fフラグを使用して、正規化されたバージョンを印刷します。例えば:

readlink -f /root/Public/myothertextfile.txt

からman readlink

-f, --canonicalize
      canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist

8
別の質問で提案されているように、あなたは使いたいかもしれませんreadlink -f
デニルソンサマイア

5
これをMac OS Xで機能させるには、brew install coreutils。これは、文字で始まるコマンドの基本的なGNUバージョンのインストールg、すなわちgreadlink -f somefile
マイク・D

-fスイッチを使用すると、コマンドは私の場合は何も返しません
。– sotn

-fを使用すると、必要な情報、つまり複数のシンボリックリンクの解決と最終ターゲットの表示が得られました。
-isapir

Ubuntu 18.04.1 LTS (Bionic Beaver)READLINKのmanページと言ってノートを持っている「ノートのrealpath(1)正規化機能のために使用することが好ましいコマンドです。」
サムカメンスキー

23

readlinkは必要なコマンドです。コマンドのマニュアルページをご覧ください。実際のファイルへのシンボリックリンクのチェーンを追跡する場合は、-eまたは-fスイッチが必要なためです。

$ ln -s foooooo zipzip   # fooooo doesn't actually exist
$ ln -s zipzip zapzap

$ # Follows it, but doesn't let you know the file doesn't actually exist
$ readlink -f zapzap
/home/kbrandt/scrap/foooooo

$ # Follows it, but file not there
$ readlink -e zapzap

$ # Follows it, but just to the next symlink
$ readlink zapzap
zipzip

最初の答えに問題はありませんが、これはより完全で有用です。
マイクS


4

リンクのソースとリンク先を表示する場合は、を試してくださいstat -c%N files*。例えば

$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’

解析には適していません(そのために使用しますreadlink)が、リンク名とリンク先を表示します。ls -l

-c書くことができ--format%N「シンボリックリンクの場合は逆参照で引用されたファイル名」を意味します。


2

これreadlinkは良いことですが、GNU固有の非クロスプラットフォームです。のクロスプラットフォームスクリプトを記述していたため/bin/sh、次のようなものを使用します。

 ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'

または:

 ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'

しかし、これらは異なるプラットフォームでテストする必要があります。それらは機能すると思いますが、ls出力形式が100%確実ではありません。

の結果は、またはのような外部コマンドに依存せずlsに解析することもできます。bashawksedperl

このbash_realpath関数は、リンクの最終宛先を解決します(リンク→リンク→リンク→最終):

bash_realpath() {
  # print the resolved path
  # @params
  # 1: the path to resolve
  # @return
  # >&1: the resolved link path

  local path="${1}"
  while [[ -L ${path} && "$(ls -l "${path}")" =~ -\>\ (.*) ]]
  do
    path="${BASH_REMATCH[1]}"
  done
  echo "${path}"
}

1

を使用できない場合readlink、結果の解析は次のls -lように行うことができます。

通常の結果は次のとおりです。

ls -l /root/Public/myothertextfile.txt
lrwxrwxrwx 1 root root 30 Jan  1 12:00 /root/Public/myothertextfile.txt -> /root/Public/mytextfile.txt

そのため、「->」と含まれる矢印の前のすべてを置き換えます。sedこれに使用できます:

ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt

1

質問は、brian-brazilのような単純な答えを出すほど正確ではありません。

readlink -f some_path

実際は、パス構造に関係するすべてのシンボリックリンクを背後の最終ターゲットに逆参照しsome_pathます。

しかし、カスケードシンボリックリンクの1つのレベルは、システム内の他の特定のケースにすぎず、一般的なケースはカスケードシンボリックリンクのNレベルです。私のシステムで次を見てください:

$ rwhich emacs
/usr/bin/emacs
 /etc/alternatives/emacs
  /usr/bin/emacs24-x

rwhichこれは、which中間カスケードシンボリックリンクのすべて(stderrへ)を最終ターゲット(stdoutへ)に出力する、独自の再帰的な実装です。

次に、何が知りたい場合:

  • シンボリックリンク / usr / bin / emacs ** のターゲット、私への明白な答えは次の/etc/alternatives/emacsように返されます:

    readlink $(which emacs)
    readlink /usr/bin/emacs
    
  • カスケードシンボリックリンク / usr / bin / emacsの背後にある最終ターゲット。答えは次のよう/usr/bin/emacs24-xに返されます。

    readlink -f $(which emacs)
    readlink -f /usr/bin/emacs
    rwhich emacs 2>/dev/null
    

0

llまたはls -l、シンボリックリンクとそのターゲットを含むディレクトリ項目をリストする必要があります

cd -P /root/Public/myothertextfile.txt (あなたの場合)元のパスを指す必要があります


0

フォルダーとそのサブフォルダー内のすべてのリンクのターゲットが見つかった場合find . -type l -ls、次のようにリンクタイプを指定してコマンドを使用します。

me@local.localdomain:~/test$ find . -type l -ls
8601855888        0 lrwxr-xr-x    1 me           staff                   6 Jan 24 19:53 ./link -> target

単一のターゲットが必要な場合は、次のように動作するls -lはずです。

me@local.localdomain:~/test$ ls -l 
total 0
lrwxr-xr-x  1 me  staff  6 Jan 24 19:53 link -> target
-rw-r--r--  1 me  staff  0 Jan 24 19:53 target
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.