파일을 이동하고 심볼릭 링크로 대체

파일을 이동하고 심볼릭 링크로 대체

누군가 나에게 명령을 내릴 수 있습니까?

  • 파일을 새 디렉터리로 이동
  • 새 위치를 가리키는 이전 위치에 심볼릭 링크를 남깁니다.

답변1

mv파일이 이동되고 ln -s심볼릭 링크가 생성되므로 기본 작업은 다음 두 명령을 실행하는 스크립트를 통해 수행됩니다.

#!/bin/sh
mv -- "$1" "$2"
ln -s -- "$2" "$1"

몇 가지 주의 사항이 있습니다. 두 번째 인수가 디렉터리인 경우 mv파일은 해당 디렉터리로 이동되지만 ln -s이동된 파일 대신 해당 디렉터리에 대한 링크가 생성됩니다.

#!/bin/sh
set -e
original="$1" target="$2"
if [ -d "$target" ]; then
  target="$target/${original##*/}"
fi
mv -- "$original" "$target"
ln -s -- "$target" "$original"

주목해야 할 또 다른 점은 첫 번째 매개변수가 ln -s심볼릭 링크의 정확한 텍스트라는 것입니다. 이는 명령이 실행되는 디렉터리가 아니라 대상 위치를 기준으로 합니다. 원래 위치가 현재 디렉터리에 없고 대상이 절대 경로로 표시되지 않으면 링크가 올바르지 않습니다. 이 경우 경로를 다시 작성해야 합니다. 이 경우에는 절대 링크를 만듭니다(상대 링크가 더 좋지만 올바르게 연결하기는 더 어렵습니다). 이 스크립트에서는 줄 바꿈으로 끝나는 파일 이름이 없다고 가정합니다.

#!/bin/sh
set -e
original="$1" target="$2"
if [ -d "$target" ]; then
  target="$target/${original##*/}"
fi
mv -- "$original" "$target"
case "$original" in
  */*)
    case "$target" in
      /*) :;;
      *) target="$(cd -- "$(dirname -- "$target")" && pwd)/${target##*/}"
    esac
esac
ln -s -- "$target" "$original"

파일이 여러 개 있으면 반복해서 살펴보세요.

#!/bin/sh
while [ $# -gt 1 ]; do
  eval "target=\${$#}"
  original="$1"
  if [ -d "$target" ]; then
    target="$target/${original##*/}"
  fi
  mv -- "$original" "$target"
  case "$original" in
    */*)
      case "$target" in
        /*) :;;
        *) target="$(cd -- "$(dirname -- "$target")" && pwd)/${target##*/}"
      esac
  esac
  ln -s -- "$target" "$original"
  shift
done

답변2

나는 보통 다음 한 줄 함수를 사용합니다.

function ml() { mkdir -p "$(dirname "$1")" && rsync -aP --no-links "$1" "$2" && ln -sf "$2" "$1" }

사용법은 mv 또는 cp와 유사합니다.

ml old_file target_dir/new_file_name

그것을 파괴:

  • mkdir -p "$(dirname "$1")"- 대상 디렉터리가 아직 존재하지 않는 경우 생성합니다.
    • dirname "$1"- 경로의 디렉토리 부분을 가져옵니다(파일 이름 제거).
  • rsync -aP --no-links "$1" "$2"- 파일을 대상으로 복사합니다. mv "$1" "$2"두 파일이 모두 동일한 파일 시스템에 있는 경우 더 나은 성능을 위해 파일을 교체하십시오.
    • -a- 소유권 및 기타 모든 권리는 보유됩니다. 원하는 구성요소만 유지되도록 조정할 수 있습니다.
    • -P- 진행 상황을 표시합니다.
    • --no-links- 링크를 복사하지 마십시오. 즉, 동일한 파일에 대해 이 명령을 여러 번 실행할 수 있으며 실수로 자체 심볼릭 링크로 대상 파일을 덮어써도 파일이 손실되지 않습니다.
  • ln -sf "$2" "$1"- 새 파일에 대한 심볼릭 링크로 이전 파일을 덮어씁니다.
    • -s- 심볼릭 링크를 사용하세요
    • -f- 오래된 파일 덮어쓰기

답변3

.sh 파일에 넣고 실행 가능하게 만듭니다( chmod +x filename).

#!/bin/bash

mv "$1" "$2"
ln -s "$2" "$1"

사용 예:

./test.sh asdf otherdir/asdf

보안 검사 등은 수행되지 않습니다. 작업의 복잡성에 따라 이 정도면 충분할 수 있습니다.

관련 정보