同じディレクトリにシンボリックリンクを作成する

同じディレクトリにシンボリックリンクを作成する

リンクの作成に問題があります。以下を作りたいです。

ls -la /usr/pkgs/python3/
total 44
drwxr-xr-x   5 root root 4096 Sep  3  2020 .
drwxrwxr-x 259 root root 20480 Feb 16 06:49 ..
drwxr-xr-x   7 root root 4096 Jan  9  2018 3.6.3
lrwxrwxrwx   1 root root    5 Nov  8  2018 3.6.3a -> 3.6.3

私は走る:

ln -s /usr/pkgs/python3/3.6.3 /usr/pkgs/python3/3.6.3a

しかし、以下を生成します。

ls -la /usr/pkgs/python3/
total 0
drwxrwxr-x 3 root root 20 Mar 27 23:47 .
drwxrwxr-x 3 root root 21 Mar 27 23:47 ..
drwxrwxr-x 4 root root 41 Mar 27 23:47 3.6.3a

ls -la /usr/pkgs/python3/3.6.3a/
total 0
drwxrwxr-x 4 root root 41 Mar 27 23:47 .
drwxrwxr-x 3 root root 20 Mar 27 23:47 ..
lrwxrwxrwx 1 root root 29 Mar 27 23:48 3.6.3 -> /usr/pkgs/python3/3.6.3

上記の例のように、相対パスではなくリンクの実際のパスを使用したいと思います3.6.3a -> 3.6.3。私は何を見逃していますか?

ベストアンサー1

これは、名前付き3.6.3aディレクトリがすでに存在するために発生します/usr/pkgs/python3/

このlnコマンドには複数の形式があります。引用するPOSIX仕様(強調):

要約

ln [-fs] [-L|-P] source_file target_file
ln [-fs] [-L|-P] source_file... target_dir

説明する

最初の要約フォームでは、lnユーティリティは次に指定されたターゲットパスに新しいディレクトリエントリ(リンク)を作成する必要があります。ターゲットファイルオペランド。このオプションを指定すると、指定され-sたファイルへのシンボリックリンクが生成されます。ソースファイルオペランド。最初の要約フォーム最後のオペランドが既存のディレクトリの名前を指定していない場合は、想定する必要があります。;

2番目の要約形式では、lnユーティリティは新しいディレクトリエントリ(リンク)を作成するか、-sこのオプションが指定されている場合はシンボリックリンクを作成する必要があります。ソースファイルターゲットパスにあるオペランド既存のディレクトリ名は宛先ディレクトリ

名前付きファイル(広い意味で通常のファイルである必要はありません)があり、名前付きファイルが存在しない場合、3.6.3実行する/usr/pkgs/python3/コマンド3.6.3aは期待される結果を提供します。

メモ(3.6.3存在し、3.6.3a存在しないと仮定)

ln -s /usr/pkgs/python3/3.6.3 /usr/pkgs/python3/3.6.3a

中に絶対パスへのリンクを作成します。

ln -s 3.6.3 /usr/pkgs/python3/3.6.3a

3.6.3a3.6.3リンク自体と同じディレクトリに存在する必要があるファイル名を付けた相対リンクを作成します。 (もちろん、ln -s ../path/to/3.6.3 /usr/pkgs/python3/3.6.3a別のディレクトリにあるファイルへの相対リンクを作成するためにも使用できます)。
GNU実装には、絶対パスから相対リンクを作成するオプションがlnあります。-r

$ cd /tmp/
$ mkdir dir dir/subdir
$ touch file
$ ln -sr /tmp/file dir/subdir/link_to_file
$ ls -gG /tmp/dir/subdir/link_to_file 
lrwxrwxrwx 1 10 Mar 28 01:31 /tmp/dir/subdir/link_to_file -> ../../file

おすすめ記事