심볼릭 링크 및 디렉터리 전환

심볼릭 링크 및 디렉터리 전환

디렉토리와 심볼릭 링크가 있습니다.

mkdir dir
ln -s dir dir_symlink

심볼릭 링크를 디렉토리로 바꾸고 디렉토리를 심볼릭 링크로 바꾸고 싶습니다. 이 작업을 원자적으로(또는 매우 빠르게) 수행할 수 있는 방법이 있나요? 카탈로그가 엄청납니다.

dir이제 디렉토리에 대한 심볼릭 링크가 있어야 합니다 dir_symlink(더 이상 심볼릭 링크가 아니며 이전 내용을 포함함 dir).

답변1

이 작업을 자주 수행해야 한다면 다음과 같은 작은 bash 스크립트를 작성하겠습니다.

#!/bin/bash

echo "select symlink"
read -e -r symlink
echo "select directory"
read -e -r dir

var=$(echo "$dir" | sed 's/\///g')

rm "$symlink"
mv "$dir" "$symlink"
ln -s "$symlink" "$var"

sed명령은 /자동 완성을 사용할 때 추가된 입력을 제거합니다.
노트:디렉터리 트리를 선택한 경우 이 콘텐츠도 모두 삭제됩니다.

sed다음과 같이 줄 끝 부분만 일치하도록 알 수 있습니다 .sed 's/\/*$//g'

답변2

디렉터리가 동일한 파일 시스템에 있는 경우 mv디렉터리 이름만 바뀌고 복사는 포함되지 않습니다. 이전 심볼릭 링크를 삭제하고 디렉터리 이름을 바꾸고 mv새 심볼릭 링크를 만드세요.

답변3

이것이 macOS 컴퓨터에 있는 경우 새로운 APFS 파일 시스템은 이러한 유형의 시나리오에 대한 원자 스왑만 지원한다는 점은 주목할 가치가 있습니다. 기능이 mv와 같은 명령에 내장되어 있지 않은 것처럼 보이지만 약간의 Swift 코드로 액세스할 수 있습니다(C 코드는 거의 동일하지만 Swift REPL에 쉽게 붙여넣을 수 있어 더 쉽습니다).

import Foundation
renamex_np("/path/to/file/one", "/path/to/file/two", UInt32(RENAME_SWAP))

답변4

Linux 3.15(및 glibc 2.28)부터 renameat2이 옵션을 사용하는 시스템 호출은 RENAME_EXCHANGE디렉터리 및 기호 링크와 같은 2개의 개체를 자동으로 교체합니다. 이는 원자 전환을 활성화하지 않지만 이름 dirdir_symlink디렉터리의 순서를 보존할 수 있습니다.

  1. tmp에 대한 심볼릭 링크를 만듭니다 tmp.
  2. 교환 tmp하고 dir.
  3. dir_symlink을 가리키는 심볼릭 링크로 대체되었습니다 tmp.
  4. dir을 가리키는 심볼릭 링크로 대체되었습니다 dir_symlink.
  5. 교환 tmp하고 dir_symlink.
  6. 삭제 tmp.

C에서:

#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main() {

  symlink("tmp", "tmp");

  renameat2(AT_FDCWD, "tmp", AT_FDCWD, "dir", RENAME_EXCHANGE);

  symlink("tmp", "tmp_link");
  rename("tmp_link", "dir_symlink");

  symlink("dir_symlink", "tmp_link");
  rename("tmp_link", "dir");

  renameat2(AT_FDCWD, "tmp", AT_FDCWD, "dir_symlink", RENAME_EXCHANGE);

  unlink("tmp");
}

관련 정보