누군가 나에게 명령을 내릴 수 있습니까?
- 파일을 새 디렉터리로 이동
- 새 위치를 가리키는 이전 위치에 심볼릭 링크를 남깁니다.
답변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
보안 검사 등은 수행되지 않습니다. 작업의 복잡성에 따라 이 정도면 충분할 수 있습니다.