디렉토리 외부의 파일에 대한 상대 기호 링크가 포함된 디렉토리를 이동하는 좋은 명령은 무엇입니까?

디렉토리 외부의 파일에 대한 상대 기호 링크가 포함된 디렉토리를 이동하는 좋은 명령은 무엇입니까?

나는 가능할 때마다 상대 심볼릭 링크를 사용하는 것을 좋아합니다. 왜냐하면 내 파일 시스템이 루트가 아닌 위치에 마운트되어 있는 경우에도 마찬가지입니다.원격으로 액세스.

그러나 상대 심볼릭 링크가 포함된 디렉터리를 이동하면 일반적으로 이러한 링크는 유효하지 않게 됩니다.

전체 디렉터리(트리)를 이동하는 데 사용할 수 있는 명령을 찾고 있습니다. 디렉터리 외부를 가리키는 상대 심볼릭 링크만 다시 작성하여 여전히 동일한 파일을 가리키도록 합니다.

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 ... -print0IFS= 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

관련 정보