(문자 그대로) 대상 파일을 여는 심볼릭 링크를 만드는 방법

(문자 그대로) 대상 파일을 여는 심볼릭 링크를 만드는 방법

bar.txt디렉토리에 파일이 있고 to를 foo생성한다고 가정해 보겠습니다 .baz.txtfoo/bar.txt

./foo
./foo/bar.txt
./baz.txt -> foo/bar.txt

내 편집기를 열면 디렉토리에 열려 있다고 baz.txt생각합니다 . (문자 그대로) 열 수 있도록 링크를 만드는 방법이 있습니까 ?baz.txt.bar.txt

컨텍스트(또는 내가 이 작업을 시도하는 이유): .odt동일한 디렉토리에 남아 있는 파일에 색인을 생성하고 주석을 추가하는 많은 수의 파일이 포함된 디렉토리가 있습니다. 이 .odt파일에서는 파일 이름보다 (더 많은) 컨텍스트를 사용하여 개별 파일에 쉽게 액세스할 수 있도록 디렉터리의 색인화된 파일에 대한 하이퍼링크를 만들었습니다. 나는 하이퍼링크를 상대 경로로 저장하여 이러한 링크가 내 사용자 파일과 항상 동일한 디렉터리 트리를 갖지 않는 모든 컴퓨터에서 작동하도록 LibreOffice를 설정했습니다.

이 파일에 대한 심볼릭 링크(또는 이에 상응하는 링크)를 만들고 싶지만 .odt위의 예의 경우 링크가 열리면 baz.txtLibreOffice의 관점에서 상대 경로가 잘못됩니다. 이전에 생성된 하이퍼링크는 작동하지 않으며, (물론 비유적으로) 하이퍼링크를 생성하면 baz.txt원본 에 있게 됩니다 bar.txt.

답변1

아니요. 그러나 심볼릭 링크의 각 매개변수를 가져와 이를 $(readlink -f $the_symlink).

로우 래퍼:

#!/bin/bash -e
args=()
for a; do
    case $a in 
        -*) args+=("$a");;  #skip flags (your file names don't start with -, right?)
        *)  if ! [ -L "$a" ]; then #not a link
                args+=("$a")
            else #link => target
                args+=( "$( readlink -f "$a")" )
            fi
            ;;
    esac
done
libreoffice "${args[@]}"

이제 chmod +x lowrapper이를 PATH의 디렉터리에 넣은 다음 libreoffice 파일의 처리기를 에서 로 변경하면 libreofficelibreoffice lowrapper는 링크 대신 링크 대상을 엽니다.

답변2

할 수는 없지만 다음과 같이 "foo" 디렉토리에 대한 심볼릭 링크를 생성할 수 있습니다.

./foo
./foo/root -> .
./root -> foo/.

그런 다음 모든 하이퍼링크의 시작 부분에 "root"를 추가합니다. 이제 "."에서 문서를 열면 "root"는 "foo/."로 확인되고 "root/baz.txt"는 "foo/./baz.txt"로 확인됩니다. "root"가 "."를 가리키기 때문에 동일한 "root/baz.txt"가 "foo" 자체에서 열리면 "./baz.txt"로 구문 분석됩니다.

답변3

나는 당신이 원하는 것을 정확하게 할 수있는 방법이 없다고 생각합니다. 심볼릭 링크는 파일 시스템 구조입니다. 그러나 링크 대신 링크 대상을 여는 작은 스크립트를 생성하면 좋은 해결 방법이 있을 수 있습니다.

#!/bin/bash

i=0
declare -a targets
for file in "$@"; do
        targets[$i]="$(readlink -f "$file")"
        ((i++))
done
libreoffice "${targets[@]}"

PATH예 를 들어 ~/bin/openLink.sh실행 가능하게 만드십시오.

chmod a+x ~/bin/openLink.sh`

이제 파일 관리자(당신이 언급한 것)를 열고 파일을 caja마우스 오른쪽 버튼으로 클릭한 다음 "다음 프로그램으로 열기" => "다른 응용 프로그램"을 선택합니다..odt

대화상자로 열기

"사용자 정의 명령 사용"을 클릭하고 거기에 스크립트를 넣으십시오.

사용자 정의 명령 대화 상자

마지막으로 모든 것을 닫습니다. 이제 파일을 클릭할 때마다 .odt이 래퍼를 사용하여 파일이 열리므로 대상 디렉터리의 모든 링크가 열립니다. readlink -f일반 파일에서는 파일 이름만 반환되므로 링크가 아닌 경우에도 작동합니다 .

답변4

나는 약간 다른 접근 방식을 취하여 열려는 파일에 대한 (상대) 경로를 포함하는 "sim(ulated)link"라고 하는 새로운 파일 형식을 만든 다음 이를 처리할 스크립트를 작성했습니다.

다음 시나리오를 고려해보세요.

./dir1/dir11/foo.odt
./dir2/foo.odl

"odl"은 "OpenDocument Link"를 의미합니다. "foo.odl"의 내용은 다음과 같습니다.

../dir1/dir11/foo.odt

그런 다음 다음 스크립트를 만들어서 열 수 있습니다 *.odl(terdon의 답변에 따라 조정됨).

#!/bin/bash

declare -a targets
for file in "$@"; do
    targets+=( "$(readlink -f "$( dirname "$file" )"/"$( <"$file" )")" )
done
libreoffice "${targets[@]}"

readlink( 지정된 경로가 심볼릭 링크인 경우 해당 링크를 따르기 때문에 이를 사용하지 않으려면 간단히 사용할 수 있습니다. :)

#!/bin/bash

for file in "$@"; do
    cd "$( dirname "$file" )"
    libreoffice "$( <"$file" )"
done

그런 다음 이 스크립트를 파일 관리자의 파일과 .odl연결할 수 있습니다(terdon의 답변에서 언급한 대로). 궁극적으로 .odl파일에 대한 MIME 유형을 생성하고 이를 스크립트와 연결해야 합니다(내 경우에는 이 단계가 누락되었지만 모든 일반 텍스트 파일을 스크립트와 연결하는 것은 분명히 바람직하지 않습니다).

매우 잘 작동함에도 불구하고 PSkocik 및 terdon이 제공하는 대안보다 이 대안을 선호하는 이유는 무엇입니까? 세 가지 이유:

  • 모든 .odt파일(및 해당 링크)이 이 구조를 갖고 있는 것은 아닙니다. "대상 파일의 디렉터리에서" 열어야 합니다. 이렇게 하면 관심 있는 파일을 여는 과정에만 영향을 줍니다.

  • 시스템 일반 심볼릭 링크는 현재 컴퓨터 설정에 관계없이 작동합니다. 즉, 스크립트를 사용하여 파일을 열기 위한 설정을 변경하지 않은 컴퓨터에서 이러한 파일 중 하나를 열면 .odt해당 파일은 어쨌든 열리고 실수로 그 안에 있는 하이퍼링크 경로를 망칠 수 있습니다. 이렇게 하면 컴퓨터가 .odl파일을 열도록 설정되어 있지 않으면 작동하지 않으며 대상 파일을 직접 찾아야 합니다.

  • 마지막으로, 관련된 디렉토리 중 일부를 이동하거나 이름을 바꾸면 파일을 쉽게 검색하고 교체하여 .odl경로를 수정할 수 있습니다. (이것은 심볼릭 링크로도 가능할 수 있지만 약간 어려워 보입니다.)

주의 사항: 이것은 잘 구조화되고 중복되지 않는 경우에만 적용된다고 생각합니다.비교적파일에 지정된 경로입니다 .odl. 일부 중복성을 갖춘 절대 경로 또는 상대 경로를 사용할 수도 있으므로 작업을 보다 강력하게 수행하는 방법이 있을 수 있습니다.

관련 정보