ハードリンクからソフトリンクへ

ハードリンクからソフトリンクへ

ln最初のパラメータでソフトリンクに従わないように強制できますか?たとえば、以下ではhardハードリンクになりたいと思います。ソフトリンクsoft:

$ mkdir dir
$ ln -s dir soft
$ ln soft hard
ln: soft: Is a directory

わかりました。ただし、トラッキング時にソフトリンクln -hのみをブロックします。ln第二議論。

答え1

デフォルトでは、システムでは、ソースがlnシンボリックリンクの場合、ソースは完全に検証されます。-Pこれを防ぐ標準オプションがあります。

$ mkdir dir
$ ln -s dir soft
$ ls -l
total 4
drwxr-xr-x  2 myself  wheel  512 Sep 21 22:39 dir
lrwxr-xr-x  1 myself  wheel    3 Sep 21 22:39 soft -> dir
$ ln -P soft hard
$ ls -il
total 4
129605 drwxr-xr-x  2 myself  wheel  512 Sep 21 22:39 dir
129606 lrwxr-xr-x  2 myself  wheel    3 Sep 21 22:39 hard -> dir
129606 lrwxr-xr-x  2 myself  wheel    3 Sep 21 22:39 soft -> dir

lnこのユーティリティのPOSIX仕様説明する:

source_fileがシンボリックリンクの場合:

この-Pオプションが適用される場合は、引数として、ターゲットパスを引数に、引数として、0を引数としてlinkat()使用する関数と同じことを行う必要があります。source_filepath1path2AT_FDCWDfd1fd2flag

linkat()これが何であるかわからない限り、この記事のほとんどは横説説です。OpenBSD マニュアルそれを翻訳する

-P

ハードリンクを作成し、ソースがシンボリックリンクの場合は、シンボリックリンク自体にリンクします。この-Pオプションは前の-Lオプションよりも優先されます。

...そしてGNUマニュアル説明する

-P
--physical

-s適用されず、ソースファイルがシンボリックリンクの場合、シンボリックリンク自体へのハードリンクが作成されます。カーネルがサポートしていないプラットフォームでは、このオプションは同じ内容のシンボリックリンクを生成します。シンボリックリンクの内容は編集できないため、両方のリンクを介して実行されるファイル名の解決は、ハードリンクが作成されたものと同じです。


ln興味深いことに、Ubuntu LinuxのGNUマニュアルには次のようなものがあります。

-s無視して-Lを使用してください-P。それ以外の場合は、TARGET指定された最後のオプションがaがシンボリックリンクの場合の動作を制御します。デフォルトは-P

そしてOpenBSDとmacOS(そしておそらく異なるシステム)では、同じGNUlnマニュアルに次のように書かれています。

-s無視して-Lを使用してください-P。それ以外の場合は、TARGET指定された最後のオプションがaがシンボリックリンクの場合の動作を制御します。デフォルトは-L

(常に起こっているように見えるインターネット上の任意のページではなく、使用しているシステムのマニュアルを常に読む必要があるもう1つの理由です。)

関連情報