나는 가능할 때마다 상대 심볼릭 링크를 사용하는 것을 좋아합니다. 왜냐하면 내 파일 시스템이 루트가 아닌 위치에 마운트되어 있는 경우에도 마찬가지입니다.원격으로 액세스.
그러나 상대 심볼릭 링크가 포함된 디렉터리를 이동하면 일반적으로 이러한 링크는 유효하지 않게 됩니다.
전체 디렉터리(트리)를 이동하는 데 사용할 수 있는 명령을 찾고 있습니다. 디렉터리 외부를 가리키는 상대 심볼릭 링크만 다시 작성하여 여전히 동일한 파일을 가리키도록 합니다.
Stack Overflow에 관련 질문이 있습니다.상대 심볼릭 링크를 이동하는 방법은 무엇입니까?. 또한 Unix 및 Linux에서는트리 외부를 가리키는 디렉토리 트리에서 모든 심볼릭 링크 찾기, 및 (더 어려운 문제를 언급함)대상 파일을 이동하거나 이름을 바꾸기 위한 일종의 심볼릭 링크 지원이 있습니까?.
예를 들어 mv-rel
다음과 같이 동작하는 명령이 있습니다(다른 명령은 GNU coreutils 버전입니다).
$ mkdir foo
$ touch bar
$ ln -sr bar foo/
$ touch foo/flob
$ ln -sr foo/flob foo/qux
$ ls -gG foo/
total 0
lrwxrwxrwx 1 6 Dec 1 00:05 bar -> ../bar
-rw-r--r-- 1 0 Dec 1 00:24 flob
lrwxrwxrwx 1 4 Dec 1 00:24 qux -> flob
$ mkdir baz
$ mv-rel foo/ baz
$ ls -gG baz/foo/
total 0
lrwxrwxrwx 1 6 Dec 1 00:05 bar -> ../../bar
-rw-r--r-- 1 0 Dec 1 00:24 flob
lrwxrwxrwx 1 4 Dec 1 00:24 qux -> flob
뭔가 빠진 것이 없다면 이것은 "mv" 명령(및 "cp"도 가능)에 대한 유용한 명령줄 옵션인 것 같습니다. 하지만 이 질문의 목적을 위해 저는 현재 존재하는 것 또는 이 기능을 구현하는 간단한 이식 가능한 스크립트를 찾고 있습니다.
답변1
결국 솔루션을 작성하여 Github에 게시했습니다.
https://github.com/minTaqa/mvrel
두 개의 인수만 허용되고 두 번째 인수는 디렉터리여야 하므로 현재 "mv"만큼 유연하지 않습니다. 그러나 상대적인 심볼릭 링크가 많은 콘텐츠를 이동하는 데 유용하다고 생각합니다. 저는 파일 이름에 있는 공백, 줄 바꿈 및 기타 헛소리를 처리할 수 있는지 확인하고 싶었기 때문에 Bash로 작성된 TAP 호환 테스트 프레임워크인 Bats에 대해 배우고 그 안에서 단위 테스트를 수행할 수 있는 기회이기도 했습니다. 모든 것이 괜찮다는 것입니다.
스크립트 자체도 Bash로 작성되었습니다. 나는 이것이 이 작업을 위한 가장 간단하고 이식성이 높은 언어라고 생각했지만 결국 다음 문제를 해결해야 했습니다.명령 대체는 후행 줄 바꿈을 제거합니다.(파일 이름 뒤에 개행 문자가 있으면 문제가 됩니다. 이는 대부분 이론적이지만 여전히 짜증스럽습니다.) 그 다음에있고find ... -print0
IFS= read -rd ''
, 그리고 많은 따옴표와 "--" 매개변수 - 이러한 것들은 Perl과 같은 하위 수준 스크립트 언어에서는 필요하지 않습니다. 나도 안 할 거야매개변수 확장을 통한 문자열 조작펄에서. 어쨌든 원한다면 Perl이나 C로 다시 작성할 수도 있지만 실제로 Bash에서는 꽤 짧습니다.
답변2
다음은 다소 파괴적인 접근 방식입니다. 상대 링크를 절대 링크로 바꾸십시오.
cd foo
for f in *; do
if [[ -h $f ]] # True if file is a symbolic link.
then
abs=$(readlink -f "$f") && rm "$f" && ln -s "$abs" "$f"
fi
done