code

심볼릭 링크를 먼저 삭제하지 않고 편집하는 방법이 있습니까?

codestyles 2020. 12. 4. 08:13
반응형

심볼릭 링크를 먼저 삭제하지 않고 편집하는 방법이 있습니까?


그래서 심볼릭 링크를 만들었습니다.

ln -s /location/to/link linkname

이제 심볼릭 링크가 연결되는 위치를 변경하고 싶습니다. 어떻게하나요? 먼저 삭제하지 않고 할 수있는 방법이 있습니까?


다른 이름으로 새 링크를 만든 다음 이동하여 이전 링크를 바꿀 수 있습니다.

ln -s /location/to/link linkname

나중

ln -s /location/to/link2 newlink
mv newlink linkname

경우 newlinklinkname동일한 물리적 장치 인이 mv원자이어야한다.


시도해보십시오 ln -sf new_destination linkname.


심볼릭 링크 대상이 디렉토리 인 -T경우 mv명령에 플래그 를 추가해야합니다 . 그렇지 않으면 새 심볼릭 링크를 이전 심볼릭 링크의 대상 디렉토리로 이동합니다.

웹 사이트를 새 버전으로 원자 적으로 전환하는 예 :

원래 설정-웹 사이트는 symlink를 www1가리키는 가상 호스트 디렉토리에 저장됩니다 www.

ln -s www1 www

웹 사이트로 이동하고 이전 버전을 참조하십시오.

새 웹 사이트 파일을 새 www2디렉토리 에 넣습니다 .

새 웹 사이트에 대한 새 심볼릭 링크 설정 :

ln -s www_new www2

www새 웹 사이트의 디렉토리로 심볼릭 링크 이동 :

mv -T www_new www

웹 사이트로 이동하여 즉시 새 버전을 확인하십시오.


symlink 대상을 변경하십시오.

# ln -sfT /path/to/new/target linkname

이것은 즉각적이고 원자적인 변화입니다.


디렉토리의 경우 다음을 수행하십시오. ln -sfT / location / to / new / target old_linkname


OSX에서 ln의 man 페이지에는 다음과 같이 할 수 있다고 나와 있습니다.

ln -shf /location/to/link link name

man 페이지에서 :

The options are as follows:
 -F    If the target file already exists and is a directory, then remove it so that the link may occur.  The -F
       option should be used with either -f or -i options.  If none is specified, -f is implied.  The -F option is
       a no-op unless -s option is specified.

 -h    If the target_file or target_dir is a symbolic link, do not follow it.  This is most useful with the -f
       option, to replace a symlink which may point to a directory.

 -f    If the target file already exists, then unlink it so that the link may occur.  (The -f option overrides any
       previous -i options.)

 -i    Cause ln to write a prompt to standard error if the target file exists.  If the response from the standard
       input begins with the character `y' or `Y', then unlink the target file so that the link may occur.  Other-
       wise, do not attempt the link.  (The -i option overrides any previous -f options.)

 -n    Same as -h, for compatibility with other ln implementations.

 -s    Create a symbolic link.

 -v    Cause ln to be verbose, showing files as they are processed.

No. The symlink system call will return EEXIST if newpath already exists. You can only link from a new node in the filesystem. What's the requirement here? If you're worried about a race due to the non-atomicity of the unlink/symlink calls, then you might want to rethink the architecture a little to provide synchronization elsewhere. There have been some scary security bugs introduced by this kind of thing.


Chain the commands like this:

rm currentlink && ln -s /path/to/link currentlink

The first command removes the existing one and the 2nd immediately creates it again.


As others have mentioned, you basically have to delete the symlink first, either manually or by passing the -f flag to the ln utility.

Years ago, I had to make small edits to symlinks pretty frequently, so I wrote a simple readline-based utility (edln) to make this less annoying. In case anyone else finds it useful, I've put it online at https://github.com/jjlin/edln/.

edln will display the original symlink target; you can then use the arrow keys, or standard readline keystrokes (M-b, M-f, C-d, etc.) to move around and edit the target.


Just googled, found no good answer and had to solve myself:

ln -f -s -T `readlink SomeLibrary | sed 's/version.old/version.new/'` SomeLibrary

Editing by definition means not recreating from scratch but changing partly. Any answer requiring to memorize a path, maybe long or with weird symbols, is definitely bad.

참고URL : https://stackoverflow.com/questions/1727280/is-there-a-way-to-edit-a-symlink-without-deleting-it-first

반응형