既存のディレクトリへのシンボリックリンク

既存のディレクトリへのシンボリックリンク

ターゲットがすでに存在するという事実を考慮すると、/home/user/app/publicにリンクする適切な方法はありますか?/home/user/public_html

そうするとln -s /home/user/app/public /home/user/public_html、結局 になってしまうのです/home/user/public_html/public

のような動作を逆にすることも可能だと思いますが、最終結果としてln -s /home/user/public_html /home/user/app/publicどのように回避するかはわかりません。/home/user/app/public/public_html

答え1

あなたの問題を正しく理解させてください

ソースは/home/user/public_htmlで、そこにファイルがあると思います。 でこのディレクトリへのリンクを作成したいとします/home/user/app/public。 この方法では、 のように操作しls /home/user/app/publicて に存在する のファイルを確認できます/home/user/public_html

これが正しければ、ソースは/home/user/public_html、ターゲットは です/home/user/app/public。正しいコマンドは次のようになります。

ln -s /home/user/public_html /home/user/app/public

/home/user/app/publicコマンドを入力する前に、有効なディレクトリまたはファイルではないことを確認してください。

答え2

質問を正しく理解していれば、既存のターゲットをどのように処理するかを知りたいということだと思います。その場合、2 つのシナリオが考えられます。

1) 既存のターゲットがファイルである場合。この場合、「-f」を使用してシンボリックリンクの作成を強制できます。

2) 既存のターゲットがディレクトリである場合。この場合、現在のlnコマンドの実装に依存します。できた「-n」引数が使用可能になり、これにより、ディレクトリへのシンボリックリンクが、おっしゃるように複製されるのではなく、適切に処理されます。

参照:https://unix.stackexchange.com/questions/207294/create-symlink-overwrite-if-one-exists

答え3

正しい答えはすでに選択されているので、これについて詳しく説明するつもりはありませんが、ln単純にその方法ではうまくいきません。

別の解決策mountとしては、 の代わりにを使用することですln。この場合の正しいコマンドは次のようになると思います。

sudo mount --bind ~/app/public ~/public_html

ただし、この方法で行う場合の注意点に注意してください。私の経験では、mountには権限が必要なので、 を実行する必要がありますsudo。このため、 に を入れるとセッションがロックされるため、 に入れることはできません.profile。 スクリプトに入れるか、 に追加することができます/etc/fstab。私は通常、 にバインドされたマウントを追加しませんfstabが、エントリは次のようになると思います。

/home/user/app/public /home/user/public_html none defaults,bind 0 0

または、これに非常に似たもの。 では相対パスを使用できないことはほぼ確実であるfstabため、ここで示したように、パスは絶対パスである必要があります。

答え4

@jotadepicas と @Milkmannetje がコメントで言及しているように、この問題に対処する方法はいくつかあります。

ソースが で$source、宛先が であると仮定します$target

  1. まずターゲットを手動で削除します。これは Linux と Mac で一貫して機能するはずです。

    rm "$target"
    ln -s "$source" "$target"
    
  2. Linux を使用している場合は、このオプションを使用できます-T

    ln -sT "$source" "$target"
    
  3. macOS を使用している場合は、このオプションを使用できます-F

    ln -sF "$source" "$target"
    

関連情報