はい

はい

相対シンボリックリンクのターゲットではなく、相対シンボリックリンクを指す相対シンボリックリンクを作成したいと思います。相対シンボリックリンクを作成すると、実際のシンボリックリンクを指す代わりにln解決されるようです。このプロセスをスキップできますか?以下の例では、を指しているのではなく、を指したいと思います。TARGETTARGETrsym-to-existing-rsym.txtrsym-to-target.txttarget.txt

まだ存在しないシンボリックリンク(以下の例ではrsym-to-future-rsym.txt-> -> チェーン)を指すシンボリックリンクを作成するときに機能します。future-rsym-to-target.txttarget.txt

はい

# Create initial structure
$ mkdir -p temp
$ touch temp/target.txt

# Now, create relative symlinks
$ ln -s -r temp/target.txt temp/rsym-to-target.txt
$ ln -s -r temp/rsym-to-target.txt temp/rsym-to-existing-rsym.txt
# Note that at this point temp/future-rsym-to-target.txt doesn't exist yet
$ ln -s -r temp/future-rsym-to-target.txt temp/rsym-to-future-rsym.txt
$ ln -s -r temp/target.txt temp/future-rsym-to-target.txt

$ tree -F temp/
# Note that rsym-to-existing-rsym.txt points to target.txt, not to rsym-to-target.txt
temp/
├── future-rsym-to-target.txt -> target.txt
├── rsym-to-existing-rsym.txt -> target.txt
├── rsym-to-future-rsym.txt -> future-rsym-to-target.txt
├── rsym-to-target.txt -> target.txt
└── target.txt

# Maybe the tools I'm using are just nice to me and resolve final paths?
# No, when I delete rsym-to-target.txt symlink rsym-to-existing-rsym.txt still points to target.txt
$ rm temp/rsym-to-target.txt
 tree -F temp/
temp/
├── future-rsym-to-target.txt -> target.txt
├── rsym-to-existing-rsym.txt -> target.txt
├── rsym-to-future-rsym.txt -> future-rsym-to-target.txt
└── target.txt

答え1

plain はln -sターゲットを文字列として扱います。文字列が既存のファイルへのパスであるかどうかは重要ではありません。

GNU 拡張はln -srターゲットをファイルシステムの場所として扱います。そうしないと、生成された実際のターゲットが間違っているため、ターゲットのディレクトリを逆参照する必要があります。

mkdir /tmp/demo /tmp/foreign
cd /tmp/demo
mkdir child
ln -s -r foo child/foo        # -> ../foo
ln -s /tmp/foreign elsewhere
ln -s -r foo elsewhere/foo    # -> ../demo/foo ­­— not ../foo

これは、パスの最終コンポーネントを逆参照することなく達成できますが、そうではありません。

これ手動指定されたディレクトリへのリンクを取得する方法を説明します。を使用せず、ln -r代わりに電話してください。realpath(GNU coreutilsの一部でもある)相対パスを構築します。リンク名を渡すのか、リンクが作成されるディレクトリ名を渡すのかによって、呼び出しは異なります。

$dirディレクトリの場合:

ln -s -- "$(realpath -m --relative-to "$dir" -- "$target")" "$dir"

$linkname作成するリンクのパスは次のとおりです。

ln -s -- "$(realpath -m --relative-to "$(dirname -- "$linkname")" -- "$target")" "$linkname"

関連情報