lnは複数回実行すると異なる結果を提供します。

lnは複数回実行すると異なる結果を提供します。

使用できる簡単なスクリプトがあります。第七感覚(これは孤独なオオカミのゲームブックリーダー/プレイヤーです):

#!/bin/bash
GAME_PATH=$(dirname "$(readlink -f "$0")")
SEVENTH_SENSE_PATH=$(echo ~)"/.wine/drive_c/users/"$(whoami)"/Documents"
mkdir -p $SEVENTH_SENSE_PATH
ln -s -f "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"
cd "$GAME_PATH/Lone Wolf"
wine Lone\ Wolf.exe

Windowsプログラムは、ワインディレクトリ内の予想される場所にフォルダ内のディレクトリを移動するのと同じくらい簡単ですが、これは問題ではありません。

ln最初はこれが機能します(booksユーザーとしてwineというフォルダへのシンボリックリンクを作成します)。問題は、2番目にシンボリックリンクが指すフォルダ(つまり、正確には元のフォルダ)内にシンボリックリンクを2回作成することです。 。Seventh SenseDocumentsbooksSeventh Sensebooks

何の害もありませんが、私が気づかなかった明らかなバグのようです。

booksはフォルダです(Lone Wolfスクリプトと同じフォルダにあります))。

ベストアンサー1

lncpと同様に、mvターゲットが既存のディレクトリ(ディレクトリへのシンボリックリンクを含む)かどうかによって異なります。そうでない場合は、ソースを宛先名にコピー/移動/リンクします。ターゲットが既存のディレクトリの場合、ソースはソースと同じベース名を持つターゲットディレクトリの下のファイルにコピー/移動/リンクされます。

GNU ln(Linuxで利用可能)は、ターゲットがディレクトリへのシンボリックリンクである-n場合、このオプションを使用してターゲットの下に書き込むのではなく、ターゲットを上書きします。

ln -snf "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"

または、ターゲットがディレクトリであるかどうかをテストし、ディレクトリがある場合は再生成しないことがあります。

[ -d "$SEVENTH_SENSE_PATH/Seventh Sense"/. ] ||
ln -s "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"

または、ターゲットを最初に削除してから無条件に作成することもできます。

rm -f "$SEVENTH_SENSE_PATH/Seventh Sense"
ln -s "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"

おすすめ記事