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이라는 폴더에 대한 심볼릭 링크를 생성합니다). 문제는 두 번째로 심볼릭 링크가 가리키는 폴더(아이러니하게도 정확히 원래 폴더) 내에 심볼릭 링크를 두 번 생성한다는 것입니다. .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"

답변2

이는 스크립트를 두 번째로 실행할 때 링크가 존재하고 디렉터리를 가리키기 때문에 발생합니다. 그래서 해당 디렉토리에 새 링크를 넣습니다. 다음과 같이 사용할 수 있습니다.

if test -e "$SEVENTH_SENSE_PATH/Seventh Sense"
then
 echo " link already exists"
else 
 ln -s -f "$GAME_PATH/Lone Wolf/books" "$SEVENTH_SENSE_PATH/Seventh Sense"
fi;

관련 정보