ln -sfnとrmと切断

ln -sfnとrmと切断

シンボリックリンクを削除して他のアイテムにリンクしたいです。これを行うには3つの方法があります。

ln -sfn source dest
rm dest
ln -s source dest
unlink dest
ln -s source dest

3つとも同じですか?一方を他のものよりも優先すべきですか?

答え1

それらは同じではありません。

存在する:

ln -sfn source dest

ターゲットを逆参照しないオプションは-n非標準拡張です(ln1994年バージョン3.10に追加されたGNUの拡張だと思います)。一部は同じ機能(1997年以降NetBSDなど)をln持ち、Solaris / Illumosなどの一部は追加機能(GNU以前)を持っています。-h-nln-n

GNUの動作を仮定する-nと、destディレクトリとして存在する場合、dest/sourceファイル自体がディレクトリでない限り、同じ名前のファイル(存在する場合)を置き換えるためにファイルが生成されます。

destそれ以外の場合は、既存のファイルを置き換えるためにシンボリックリンクが作成されます(存在する場合)source

ln移動/コピー/リンクできる迷惑で曖昧なインターフェースが好きまたは持っていますcpmv到着目的地または入力するただし、これはユーザーが望むものではなく、最後の引数の種類(または引数の数)によって異なります。

存在する:

rm dest
ln -s source dest

rmdest場合によっては、ユーザーにメッセージを表示でき、成功したかどうかrmにかかわらず実行される削除を試みます。削除できないディレクトリ、または削除できないディレクトリへのシンボリックリンクの場合。ディレクトリへの現在の書き込みアクセスにアクセスできない)またはソースへのシンボリックリンク(ディレクトリでないファイルがその名前で存在する場合は失敗します)。ln -s source destdest/sourcedestrmrmdest

そして:

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
    

    rmwith は-fユーザーにメッセージを表示せず、ファイルが最初に存在しなくても失敗しません。成功すると、ファイルがもう存在しないことがわかります(または少なくともrmファイルを正常に削除した後に確認されなかった場合)。しかし、他の人がディレクトリを(再)生成したりlnsource/destdestrmln

答え2

ln -sfn source dest

少なくともGNU coreutilsの文書はln誤解を招く。それは言う:

-f, --force
                     既存のターゲットファイルの削除

効果的にGNUln -fがすることは、一時的な名前で新しいシンボリックリンクを作成してから呼び出すことですrenameat。これはターゲットシンボリックリンクをアトミックに置き換えます。もちろんいいえ既存のシンボリックリンクを削除して開始します。

man ln全体的にこれが望ましいのですが、なぜ嘘なのかわかりません。

この場合、ただ結果

それでは状況も変わらないでしょう。

関連情報