シンボリックリンクを削除して他のアイテムにリンクしたいです。これを行うには3つの方法があります。
ln -sfn source dest
rm dest
ln -s source dest
unlink dest
ln -s source dest
3つとも同じですか?一方を他のものよりも優先すべきですか?
答え1
それらは同じではありません。
存在する:
ln -sfn source dest
ターゲットを逆参照しないオプションは-n
非標準拡張です(ln
1994年バージョン3.10に追加されたGNUの拡張だと思います)。一部は同じ機能(1997年以降NetBSDなど)をln
持ち、Solaris / Illumosなどの一部は追加機能(GNU以前)を持っています。-h
-n
ln
-n
GNUの動作を仮定する-n
と、dest
ディレクトリとして存在する場合、dest/source
ファイル自体がディレクトリでない限り、同じ名前のファイル(存在する場合)を置き換えるためにファイルが生成されます。
dest
それ以外の場合は、既存のファイルを置き換えるためにシンボリックリンクが作成されます(存在する場合)source
。
ln
移動/コピー/リンクできる迷惑で曖昧なインターフェースが好きまたは持っていますcp
。mv
到着目的地または入力するただし、これはユーザーが望むものではなく、最後の引数の種類(または引数の数)によって異なります。
存在する:
rm dest
ln -s source dest
rm
dest
場合によっては、ユーザーにメッセージを表示でき、成功したかどうかrm
にかかわらず実行される削除を試みます。削除できないディレクトリ、または削除できないディレクトリへのシンボリックリンクの場合。ディレクトリへの現在の書き込みアクセスにアクセスできない)またはソースへのシンボリックリンク(ディレクトリでないファイルがその名前で存在する場合は失敗します)。ln -s source dest
dest/source
dest
rm
rm
dest
そして:
unlink dest
ln -s source dest
プロンプト部分、一部のシステム、および特定の条件でディレクトリのリンクを解除できることを除いて、unlink
すべて同じです。unlink
また、XSIオプションの下のPOSIX仕様にタグが付けられていますrm
。
dest
したがって、目的がシンボリックリンクを作成することである場合は、source
次のことをお勧めします。
GNU固有:
ln -sfT source dest
(これは
-T
無効です入力するdest
モードは、ディレクトリかどうかにかかわらず、生成されると予想されるファイルとして扱います。持ち運べる:
rm -f dest && ln -sf source dest
rm
with は-f
ユーザーにメッセージを表示せず、ファイルが最初に存在しなくても失敗しません。成功すると、ファイルがもう存在しないことがわかります(または少なくともrm
ファイルを正常に削除した後に確認されなかった場合)。しかし、他の人がディレクトリを(再)生成したりln
。source/dest
dest
rm
ln
答え2
ln -sfn source dest
少なくともGNU coreutilsの文書はln
誤解を招く。それは言う:
-f, --force
既存のターゲットファイルの削除
効果的にGNUln -f
がすることは、一時的な名前で新しいシンボリックリンクを作成してから呼び出すことですrenameat
。これはターゲットシンボリックリンクをアトミックに置き換えます。もちろんいいえ既存のシンボリックリンクを削除して開始します。
man ln
全体的にこれが望ましいのですが、なぜ嘘なのかわかりません。
この場合、ただ結果
それでは状況も変わらないでしょう。