
ターゲットがすでに存在するという事実を考慮すると、/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
。
まずターゲットを手動で削除します。これは Linux と Mac で一貫して機能するはずです。
rm "$target" ln -s "$source" "$target"
Linux を使用している場合は、このオプションを使用できます
-T
。ln -sT "$source" "$target"
macOS を使用している場合は、このオプションを使用できます
-F
。ln -sF "$source" "$target"