노틸러스 : symlink를 통해 디렉토리를 방문했습니다. 이제 대상 디렉토리 계층에서 한 수준 위로 올라갈 수 없습니다.


14

"링크 만들기"옵션을 통해 바로 가기를 만들었습니다. 이 바로 가기 폴더에 들어가면 그 위에있는 폴더를 볼 수 없으므로 쉽게 이동할 수 없습니다.

GUI에서 하나의 폴더를 올리는 방법이 있습니까? 아마 단축키? ( cd ..이번에 는 할 수 없습니다 ^ __ ^).

여기에 이미지 설명을 입력하십시오


예를 들어 Windows의 경우 실제로 설명하는 방식으로 탐색 할 수 있습니다. 여기에 설명하는 Win10 이미지가 있습니다.

여기에 이미지 설명을 입력하십시오


백 스페이스 키를 사용해 보셨습니까?
PenguinCSC

3.16 미만의 노틸러스에서는 소스> 재구성 (14.04의 패치 또는 ppa 빌드 가능)을 통해 수행해야하지만 노틸러스 도구 모음에 부모 버튼을 쉽게 추가 할 수 있습니다. 그렇지 않은 경우Alt+up key
doug

Alt + Up은 링크의 대상에서 데스크탑으로 나를 안내합니다 ... 슬프게도 : \ 여기에 누군가가 제대로 연결되어 있다면 개발자 팀에 직접 제공 할 수 있습니까? 데이터가 많은 사람들을 통하지 않고 직접 제공 할 수 없어서 매우 새롭습니다.
JohnDoea

아-무슨 말인지 알 겠어. 아마도 Jacob의 해결책을 시도하거나 직접 링크를 만드십시오. 현재 링크는 디렉토리로 표시되므로 dir입니다. 링크는 일반적으로 데스크탑에 있습니다. 실행 가능한 .desktop 파일을 사용하여 링크를 만들면 해당 'link'를 사용한 후 탐색이 정상입니다.
doug

askubuntu.com/questions/713397/show-full-path-for-links 와 동일한 질문 (해결 된 경우 다른 항목을 중복으로 표시)
user.dz

답변:


17

이것이 어려운 질문 인 이유

이 질문에는 몇 가지 과제가 있습니다.

  • nautilus 예를 들어 현재 활성 디렉토리를 얻기 위해 명령 행에서 직접 통신하지 않으며 현재 열려있는 폴더 (창)를 명령 행에서 다른 디렉토리로 "전송"할 수 없습니다.
  • 현재 경로 "NAUTILUS_SCRIPT_CURRENT_URI"에서을 통해 요청한대로 노틸러스는 현재 폴더 의 실제 경로를 반환하지 않지만 링크를 실제 폴더 인 것처럼 "인식"합니다.

따라서 솔루션은 점점 더러워집니다. 해결 방법을 찾아야합니다. 이 문제를 해결하기위한 네 가지 옵션이 있습니다.

1. 오른쪽 클릭으로 한 레벨 위로 이동

현재 디렉토리 의 실제 경로 를 얻으려면 링크에서 정보를 검색해야합니다. ls -l링크 를 사용하여 다음 과 같이 출력 할 수 있습니다 .

lrwxrwxrwx 1 jacob jacob 35 jan 15 08:23 /home/jacob/Bureaublad/Flyer_st/Verwijzing naar Site_current -> /home/jacob/Bureaublad/Site_current

어디 부분은 후에 ->는 IS 실제 사용하여 심볼릭 링크 내부 경로, 또는 python:

real = os.path.realpath("/path")

이것을 nautilus스크립트 에서 사용 하면 현재 파일이나 폴더 의 실제 경로를 간접적으로 얻을 수 있습니다 .

그렇다면 우리가 길을 가졌다면 어떻게 노틸러스가 한 단계 위로 이동합니까?

다시 말하지만, 우리는이 문제를 해결할 수 깨끗한 우리의 손을 유지. 한 레벨 위로 이동하려면 먼저 다음에서 찾은 경로를 약간 편집하십시오.

/path/to/a/folder

으로

/path/to/a

다음 사용하여 xdotool시뮬레이션 Ctrl+ L(다른 디렉토리로 이동 할 CLI 옵션이 없기 때문에, 노틸러스 창에 경로를 삽입 할 GUI 바로 가기를 현재 창을 사용하여이 ), 이후 수 있도록하는 xclip편집 된 경로 +를 붙여 Enter, 우리는 해결책을 작업 한 !

실제로

  1. 우리는 내 바탕 화면의 링크 ( "텔레 그램에 링크")에서 열린 폴더 안에 있습니다. 실제 폴더 내의 하위 폴더입니다 Downloads폴더 :

    여기에 이미지 설명을 입력하십시오

  2. 그런 다음 우리는에 커서를 대고 오른쪽 버튼을 클릭하면 모든 스크립트를 실행하는 폴더에있는 파일 :

    여기에 이미지 설명을 입력하십시오

  3. 상위 디렉토리의 경로가 자동으로 삽입됩니다.

    여기에 이미지 설명을 입력하십시오

  4. 또한 자동으로 Return누르면 디렉토리 레벨이 한 단계 위로 올라갑니다.

    여기에 이미지 설명을 입력하십시오

스크립트

#!/usr/bin/env python3
import subprocess
import os
import time

def run(cmd):
    subprocess.call(["/bin/bash", "-c", cmd])

current = os.getenv("NAUTILUS_SCRIPT_CURRENT_URI").replace("file://", "").replace("%20", " ")
real = os.path.realpath(current)
up = os.path.abspath(os.path.join(real, os.pardir))
run("xdotool key Control_L+l")
run("printf '"+up+"' | xclip -selection clipboard")
run("xdotool key Control_L+v")
# confirm by virtually press Return
time.sleep(0.1)
run("xdotool key Return")

설정 방법

  1. 스크립트는 모두 필요 xdotool하고를 xclip:

    sudo apt-get install xdotool xclip
    
  2. 디렉토리가 존재하지 않는 경우 디렉토리를 작성하십시오.

    ~/.local/share/nautilus/scripts
    
  3. 로 저장, 빈 파일로 위의 스크립트를 복사 level_up에서 (확장자) ~/.local/share/nautilus/scripts, 그리고 그것을 실행하기

  4. 로그 아웃했다가 다시 로그인해야 할 수도 있습니다.
  5. 이제 파일 (모든)> 스크립트> level_up 을 마우스 오른쪽 버튼 으로 클릭하여 스크립트를 실행할 수 있습니다 .

    여기에 이미지 설명을 입력하십시오


[ 편집 ] 경로를 입력 하는 대신 창 에 붙여 넣기 위해 위의 스크립트를 변경 했습니다. 그것은 설치했지만, 특히 매우 긴 경로에 주요 개선한다.nautilusxdotool needs xclip


2. 또는 상위 디렉토리에서 새 노틸러스 창을 엽니 다

당신은 할 수 사용하지 않는 xdotool스크립트가 열함으로써, 새로운 부모의 디렉토리에, 노틸러스 창을여십시오. 그러면 스크립트가 더 짧아집니다.

#!/usr/bin/env python3
import subprocess
import os

def run(cmd):
    subprocess.call(cmd)

current = os.getenv("NAUTILUS_SCRIPT_CURRENT_URI").replace("file://", "").replace("%20", " ")
real = os.path.realpath(current)
up = real[:real.rfind("/")]
subprocess.Popen(["nautilus", up])

이 경우을 설치할 필요가 없습니다 xdotool. 원래 창을 닫고 새 창을 정확히 동일한 위치 (& 크기)에 배치하여 스크립트를 확장 할 수도 있습니다.

단점은 원래 창의 이력이 이런 식으로 손실된다는 것입니다.

3. 추가 솔루션 : (자동으로) 링크를 만드는 대체 방법

기존 링크와 관련이 없지만 GUI에서 사용될 때 .desktop마우스 오른쪽 버튼을 클릭 하면 실행 파일 을 자동으로 생성하는 노틸러스 스크립트 가 도움이 될 수 있습니다.

디렉토리를 마우스 오른쪽 버튼으로 클릭하여 링크로 작동하는 바로 가기를 만듭니다.

여기에 이미지 설명을 입력하십시오

심볼릭 링크와 달리이 링크는 폴더 자체로 동작하지 않고 실제 폴더로 이동합니다.

여기에 이미지 설명을 입력하십시오

스크립트

#!/usr/bin/env python3
import subprocess
import os

current = os.getenv(
    "NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
    ).replace("file://", "").replace("%20", " ").strip()

if os.path.isdir(current):
    parent = os.path.abspath(os.path.join(current, os.pardir))
    fldr_path = '"'+current+'"'
    folder = current[current.rfind("/")+1:]
    linkfilename = parent+"/"+folder+"link.desktop"
    linkdata = [
        "[Desktop Entry]",
        "Type=Application",
        "Name=Link to -> "+folder,
        "Icon=folder",
        "Exec=nautilus "+fldr_path,
        ]
    with open(linkfilename, "wt") as wt:
        for l in linkdata:
            wt.write(l+"\n")
    command = "chmod +x "+"'"+linkfilename+"'" 
    subprocess.Popen(["/bin/bash", "-c", command])

사용하는 방법

  1. 로 저장, 빈 파일에 스크립트를 복사 make_link에서 (확장자) ~/.local/share/nautilus/scripts, 그리고 그것을 실행하기
  2. 첫 번째 이미지에서와 같이 스크립트를 마우스 오른쪽 버튼 클릭 옵션으로 선택하여 사용하십시오. 실행 .desktop파일은 동일한 디렉토리에 작성됩니다. 필요한 경우 다른 곳으로 이동하십시오. 연결된 경로는 절대적입니다.

링크에 고유 한 아이콘 제공

대체 링크에 구별 아이콘을 제공 할 수 있습니다. 디렉토리 내에서 /usr/share/icons"폴더" 를 검색하면 수많은 유효한 옵션이 나타납니다.

스크립트에서 줄 "Icon=folder",이 대체되면 Icon=stock_folder-copy,(확장자없이 아이콘 이름 사용) 내 시스템의 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

물론 당신은뿐만 아니라 자신 만의 아이콘을 사용할 수 있습니다 중,하지만 당신은 전체 경로를 사용하는 경우 (사용하지 않는 ~), 당신은 해야 아이콘의 확장자를 포함.

4. 바로 가기 키를 사용하여 상위 디렉토리로 이동하십시오.

아마도 가장 편리한 옵션 일 것입니다. 노틸러스 창이 앞에 있으면 바로 가기 키를 눌러 한 디렉토리를 위로 이동하십시오.

스크립트

#!/usr/bin/env python3
import subprocess
import time
import os

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def run(cmd):
    subprocess.call(["/bin/bash", "-c", cmd])

# get information on the active window
front = get(["xprop", "-id", get(["xdotool", "getactivewindow"])])
# (only) if it is a "normal" nautilus window, take action
if 'WM_CLASS(STRING) = "nautilus", "Nautilus"' in front:
    # "virtually" press Ctrl + l
    run("xdotool key Control_L+l"); time.sleep(0.05)
    # copy the current path, calculate the "real" parent directory
    real = os.path.realpath(get(["xclip", "-o"]))
    up = os.path.abspath(os.path.join(real, os.pardir))
    time.sleep(0.1)
    # enter the superior directory
    run("printf '"+up+"' | xclip -selection clipboard")
    run("xdotool key Control_L+v")
    # confirm by virtually press Return
    time.sleep(0.1)
    run("xdotool key Return")

쓰다

  1. 이 솔루션의 경우, 모두 xclipxdotool필요가 시스템에 있어야합니다.

    sudo apt-get install xdodool xclip
    
  2. 스크립트를 빈 파일에 복사하고 level_up.py(어디서나) 다른 이름으로 저장하십시오 .

  3. 바로 가기 키에 추가하십시오 : 시스템 설정> "키보드"> "바로 가기"> "사용자 정의 바로 가기"를 선택하십시오. "+"를 클릭하고 다음 명령을 추가하십시오.

    python3 /path/to/level_up.py
    

NB 스크립트 때문에 옵션을,이 경우 제한된 비트있는 바로 가기 자체가 시뮬레이션됩니다Ctrl+LCtrl+Alt+ 것은L당신이 ... 로그 아웃 할 것입니다Ctrl+\내 시스템에 근무 벌금을.

설명

이 스크립트는 Ctrl+ 도 시뮬레이트 L하지만 nautilus '를 사용하는 대신 노틸러스 창에서 자동으로 선택된 경로를 복사하는 "NAUTILUS_SCRIPT_CURRENT_URI"데 사용 xclip됩니다. 옵션 1과 마찬가지로 스크립트는 실제 경로를 계산하고 상위 디렉토리를 파생시킵니다.

이 옵션은 키보드를 마우스 오른쪽 버튼으로 사용하는 것을 선호하는 경우 유용 할 수 있습니다.


3

또는 xdotool패키지가 추가 된 Ubuntu 14.04, nautilus 3.10-1의 경우 .local/share/nautilus/scripts/updirtree 파일 에서 다음을 사용 하십시오.

# In nautilus, the pwd is the actual, not the link path
xdotool key ctrl-l
xdotool type "$(dirname $(pwd))" "
"

마지막 따옴표는 개행 문자 또는 리턴 ( 0x0a) 만 포함해야합니다 . pwd내에서 노틸러스는 떠들썩한 / 터미널에서 실행할 때와 다른 결과를 생성 - 그것은 실제 경로가 아닌 링크를 사용하여 경로를 반환합니다.


나는 이해가되지 않으며, 문서화되지 않았으며, 어떤 종류의 실행 환경이 코드를 실행하고 있는지 알 수는 없지만 (결과를 생성하는 쉘을 찾을 수 없음) 작동합니다. 그것은 해킹이기 때문에 노틸러스 버전을 포함 시켰습니다. 그것이 얼마나 오래 작동하는지 누가 알 수 있습니까? 다음 노틸러스 업그레이드 (또는 알려지지 않은 해석기)에서 중단 될 수 있지만, 마운트 된 위치에 대한 링크, 디렉토리 트리의 위치에 대한 링크 또는 디렉토리 트리의 일반 위치에서 작동합니다.


우분투 15.10을 사용합니다 ... 비슷한 코드로 작동 할 수 있습니까?
JohnDoea

1
이것은 의미가 없습니다 . 노틸러스가 아닌 $(pwd) 의 작업 디렉토리입니다 . 참조 help.ubuntu.com/community/NautilusScriptsHowto
야곱 Vlijm

@benos 확인, 그것은 15.10에서 작동합니다
user.dz

@JacobVlijm, 그것은 잘 작동합니다, 그것은 합리적으로 보입니다, 노틸러스는 현재 디렉토리에서 스크립트를 실행합니다.
user.dz

1
또한 @Sneetsher는 놀랍습니다. 그러나 매우 긴 경로에서 사용될 때 타이밍 문제가 있습니다. 경로 길이에 따라 휴식을 설정해야합니다. 다른 유형의 경로가 깨져있는 것 같습니다. 처음에는 (임의의) 중단으로 수정했습니다. 최신 버전에서는 경로의 길이에 영향을받지 않는 경로를 xclip 붙여 넣었 습니다.
Jacob Vlijm

2

깨끗한 수정이지만 이 커밋 을 되돌려 소스를 다시 작성해야합니다 .

diff --git a/src/nautilus-mime-actions.c b/src/nautilus-mime-actions.c
index ca1f0ac..0b363b4 100644
--- a/src/nautilus-mime-actions.c
+++ b/src/nautilus-mime-actions.c
@@ -2029,21 +2029,13 @@ activate_activation_uris_ready_callback (GList *files_ignore,

    /* Convert the files to the actual activation uri files */
    for (l = parameters->locations; l != NULL; l = l->next) {
-       char *uri = NULL;
-
+       char *uri;
        location = l->data;

        /* We want the file for the activation URI since we care
         * about the attributes for that, not for the original file.
         */
-       if (nautilus_file_is_symbolic_link (location->file)) {
-           uri = nautilus_file_get_symbolic_link_target_uri (location->file);
-       }
-
-       if (uri == NULL) {
-           uri = nautilus_file_get_activation_uri (location->file);
-       }
-
+       uri = nautilus_file_get_activation_uri (location->file);
        if (uri != NULL) {
            launch_location_update_from_uri (location, uri);
        }

빌드 지시 사항 :

  1. 소스 다운로드 :

    apt-get source nautilus
    
  2. 빌드 종속성 다운로드

    sudo apt-get build-dep nautilus
    
  3. 위 패치에서 수정이 필요합니다

    편집하다 src/nautilus-mime-actions.c

    /* Convert the files to the actual activation uri files */
    for (l = parameters->locations; l != NULL; l = l->next) {
        char *uri = NULL;
        location = l->data;
    
        /* We want the file for the activation URI since we care
         * about the attributes for that, not for the original file.
         */
        if (nautilus_file_is_symbolic_link (location->file)) {
            uri = nautilus_file_get_symbolic_link_target_uri (location->file);
        }
    
        if (uri == NULL) {
            uri = nautilus_file_get_activation_uri (location->file);
        }
    
        if (uri != NULL) {
            launch_location_update_from_uri (location, uri);
        }
    
  4. 빌드 및 설치

    autoreconf
    ./configure
    make
    

    설치하지 않고 테스트하려면

    sudo killall -r "[\w]*nautilus"
    ./src/nautilus
    

    설치하려면

    sudo make install
    

이렇게하면 노틸러스가 대상 경로에 대한 링크를 확인합니다. BTW, 이것은 얼마 전에 버그로보고되었습니다. 이것이 기능이라고 생각하면 다른 버그 보고서를 제출하여 스위치 또는 특정 단축키 설정을 요청하십시오.

참조 : 노틸러스가 심볼릭 링크를 역 참조하지 않도록하려면 어떻게해야합니까? [닫은]


문제는 현재 버전의 노틸러스를 고정하거나 업데이트 할 때마다 절차를 반복해야 할 수 있습니다.
Jacob Vlijm

1
@ JacobVlijm, 그래 deb 패키지를 빌드하면 그렇게 될 것입니다. 하지만, 그것은 설치됩니다하지 않은 /usr/local/bin/시스템이 항상 수정 된 사본을 실행할 수 있도록에서 설명 된대로,$PATH
user.dz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.