nemo: 상황에 맞는 메뉴 작업이 스크립트를 트리거하고 선택한 심볼릭 링크를 상대적으로 만듭니다.

nemo: 상황에 맞는 메뉴 작업이 스크립트를 트리거하고 선택한 심볼릭 링크를 상대적으로 만듭니다.

내 목표는 심볼릭 링크에서 심볼릭 링크를 마우스 오른쪽 버튼으로 클릭하고 nemo링크를 상대 경로로 강제로 다시 작성하는 사용자 정의 스크립트를 트리거하는 것입니다(절대 경로가 있는 경우).

문제는 절대 경로가 있는 심볼릭 링크를 생성하기 위해 에 DRAG+SHIFT+CTRL하드코딩되어 있다는 것입니다. nemo이로 인해 파일 시스템에 원격으로 액세스하려고 하면 문제가 발생합니다.

내 문제는 제스처를 유지하고 싶고 소스에서 빌드 DRAG+SHIFT+CTRL하고 싶지 않으며 nemo관련되지 않은 연결된 디렉터리를 원격으로 탐색할 수 있기를 원한다는 것입니다.

제가 생각해낸 해결책은 그 안에 새로운 상황에 맞는 메뉴 옵션을 만드는 것이었습니다. nemo이를 통해 스크립트를 트리거하여 이러한 링크를 "수정"할 수 있습니다.

새로 생성하여 상황에 맞는 메뉴 옵션을 성공적으로 생성했습니다. 다음을 .nemo_action사용하여 새 파일을 생성했습니다.GitHub의 템플릿.

이러한 유형의 파일에는 두 개의 디렉터리가 있습니다.

  • /usr/share/nemo/actions/시스템 전반에 걸친 작업
  • $HOME/.local/share/nemo/actions/사용자 작업을 위해

fix-link.nemo_action파일은 다음과 같습니다.

[Nemo Action]
Active=true
Name=Force Relative Link
Comment=If the file is a link to an absolute path, it will be forced to become relative.
Exec=<fix-link.sh %F>
Selection=any
Extensions=nodirs;
EscapeSpaces=true

fix-link.sh파일(동일한 디렉터리에 있음)은 다음과 같습니다.

#!/bin/bash
$(ln "-rs" $(readlink -f "$1") "$1.tmp")
mv -f "$1.tmp" $(readlink -f "$1")
exit 0

임시 파일은 잘 생성되었지만 덮어쓰기가 거부됩니다 . 이는 원래 절대 경로 링크를 생성할 때 설정한 권한과 관련이 있는 $(readlink -f "$1")것 같습니다 .nemoDRAG+SHIFT+CTRLl

편집하다

@Gilles는 내 스크립트에서 많은 버그를 수정했습니다. 이 시점에서 나는 파일 Extensions=nodirs;의 줄을 fix-link.nemo_action읽도록 변경해야 한다는 것을 발견했습니다 Extensions=any;. 그렇지 않으면 상황에 맞는 메뉴를 통해 이 스크립트를 활성화하거나 링크할 수도 없습니다. 디렉토리, 이것이 모든 용도로 수행되는 작업입니다.

그래서 지금

fix-link.nemo_action다음과 같이:

[Nemo Action]
Active=true
Name=Force Relative Link
Comment=If the file is a link to an absolute path, it will be forced to become relative.
Exec=<fix-link.sh %F>
Selection=any
Extensions=any;
EscapeSpaces=true

fix-link.sh파일은 다음과 같습니다.

#!/bin/bash
ln -rs -- "$(readlink -f -- "$1")" "$1.tmp"
mv -f -- "$1.tmp" "$1"

모든 것이 세상과 잘 어울립니다. 다들 감사 해요.

답변1

스크립트에 몇 가지 문제가 있습니다.

  • 큰따옴표가 누락되었습니다.에 대한 $(readlink …). 링크 대상에 공백이나 와일드카드가 포함되어 있으면 중단됩니다.
  • 명령 대체를 사용 ln하고 결과를 실행할 명령으로 사용하고 있습니다. 다행히도 ln출력이 생성되지 않으므로 아무런 해가 되지 않습니다.
  • 귀하의 mv명령은 심볼릭 링크를 대상 위치로 이동하는데 이는 의미가 없습니다.

나는 이것이 당신이 쓰고 싶은 것이라고 생각합니다 :

#!/bin/sh
ln -rs -- "$(readlink -f -- "$1")" "$1.tmp"
mv -f -- "$1.tmp" "$1"

또는 다음을 사용할 수 있습니다.symlinks많은 Linux 배포판에 존재하는 유틸리티(원래 Mark Lords가 관리하고 현재는 J. Brandt Buckley가 관리함). 이 명령은 symlinks -c /path/to/directory지정된 디렉터리의 모든 기호 링크를 상대 링크로 변환합니다.

관련 정보