Nautilus: Відвіданий каталог через symlink, тепер я не можу піднятися на один рівень вище в ієрархії цільових каталогів


14

Я створив ярлик за допомогою параметра "зробити посилання". Коли я заходжу в папку цього ярлика, я не бачу жодної папки над нею, тому не можу легко перейти до них.

Чи є спосіб перейти одну папку в GUI? Може, гаряча клавіша? (Не можу cd ..цього разу зробити ^ __ ^).

введіть тут опис зображення


Наприклад, у Windows я дійсно вмію орієнтуватися в описаному нами способі, ось зображення Win10, яке пояснює це:

введіть тут опис зображення


Ви пробували ключ Backspace?
PenguinCSC

У nautilus менше 3,16 легко додати батьківську кнопку до панелі інструментів nautilus, хоча це потрібно зробити через джерело> перебудувати (патч або збірка ppa для 14.04). Інакше спробуйтеAlt+up key
doug

Alt + Up приводить мене з пункту призначення посилання на робочий стіл ... Тож, на жаль, немає: \ Якщо хтось тут має правильні з'єднання, він може запропонувати це безпосередньо команді розробників? Я дуже нова, тому я не можу реально запропонувати це безпосередньо, без даних доведеться пройти через багатьох людей (я здогадуюсь) ...
JohnDoea

Ага - я бачу, що ти маєш на увазі. Можливо, спробуйте рішення Якова або створити посилання самостійно. Ваші поточні посилання розглядаються як каталог, так що це - dir. посилання є, як правило, на робочому столі. Якщо ви створюєте посилання за допомогою виконуваного файлу .desktop, тоді навігація після використання цього посилання буде нормальною.
дог

Тут же питання askubuntu.com/questions/713397/show-full-path-for-links (якщо вирішено, позначити інших як дублікат)
user.dz

Відповіді:


17

Чому це складне питання

Питання має кілька проблем:

  • nautilus не зв’язується безпосередньо з командного рядка, наприклад, для отримання поточно активного каталогу, а також не можна "надіслати" поточно відкриту папку (-вікно) до іншого каталогу з командного рядка.
  • У поточному шляху, за запитом через "NAUTILUS_SCRIPT_CURRENT_URI", Nautilus не повертає реальний шлях до поточної папки, але "бачить" посилання так, ніби це фактична папка.

Тому рішення настільки ж брудне, як і потрапляє; нам потрібно знайти обхідні шляхи. Нижче наведено чотири варіанти вирішення проблеми.

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

де розділ після ->- це реальний шлях всередині симпосилання або, використовуючи python:

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

Використовуючи це в nautilusсценарії, ми можемо опосередковано отримати реальний шлях до поточного файлу чи папки.

Тоді, якщо у нас є шлях, як змусити nautilus рухатися на один рівень вгору?

Знову ж таки, ми не можемо це вирішити і зберегти чисті руки. Щоб переміститись на один рівень вгору, спочатку трохи відредагуємо знайдений шлях з:

/path/to/a/folder

в

/path/to/a

потім, використовуючи xdotoolдля імітації Ctrl+ L(ярлик інтерфейсу GUI, щоб вставити шлях у вікно nautilus, оскільки немає можливості кліпу перейти до іншого каталогу за допомогою поточного вікна ), а потім зробити xclipвставити відредагований шлях +Enter , у нас є робоче рішення !

На практиці

  1. Ми знаходимося в папці, відкритій із посилання ("Посилання на Telegram") на моєму робочому столі. Реальна папкою є підпапка моєї 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:

    введіть тут опис зображення


[ EDIT ] Я змінив сценарій вище, щоб вставити шлях у nautilusвікно, а не xdotool вводити його. Він needs xclipповинен бути встановлений, але це суттєве вдосконалення, особливо на дуже довгих шляхах.


2. Крім того, відкрийте нове вікно nautilus у каталозі Superior

Ви можете уникнути використання xdotool, змусивши скрипт відкрити нове вікно nautilus у батьківському каталозі. Потім сценарій буде ще коротшим:

#!/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. Додаткове рішення: альтернативний спосіб (автоматично) створення посилань

Не стосується існуючих посилань, але при використанні з графічного інтерфейсу .desktopможе бути корисним сценарій nautilus для автоматичного створення виконуваних файлів при натисканні правою кнопкою миші:

клацніть правою кнопкою миші на каталозі, щоб створити ярлик (поводиться як посилання)

введіть тут опис зображення

На відміну від символьних посилань, ці посилання перейдуть до фактичної папки, не ведучи себе як папка:

введіть тут опис зображення

Сценарій

#!/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. Клацніть клавішу швидкого скорочення до вищої директорії

Напевно, найбільш зручний варіант; маючи вікно nautilus попереду, натисніть клавішу скорочення, щоб перемістити один каталог вгору.

Сценарій

#!/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. Для цього рішення обидва xclipта xdotoolПотрібно бути у вашій системі.

    sudo apt-get install xdodool xclip
    
  2. Скопіюйте скрипт у порожній файл, збережіть його level_up.py(будь-де).

  3. Додайте її до клавіші швидкого доступу: виберіть: Налаштування системи> "Клавіатура"> "Ярлики"> "Спеціальні ярлики". Клацніть "+" і додайте команду:

    python3 /path/to/level_up.py
    

NB контекстних варіантів небагато обмежений в цьому випадку, так як скрипт сам буде моделюватиCtrl+LіCtrl+Alt+Lзмусить вас вийти ...Ctrl+\працювали відмінно на моїй системі.

Пояснення

Цей сценарій також імітує Ctrl+ L, але замість того, щоб використовувати nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI", він використовуєxclip для копіювання автоматично вибраного шляху у вікно nautilus. Як і варіант 1, сценарій потім обчислює реальний шлях і отримує головний каталог.

Цей параметр може бути корисним, якщо ви віддаєте перевагу клавіатурі, ніж клацнути правою кнопкою миші.


3

Або для Ubuntu 14.04, nautilus 3.10-1, з xdotoolдоданим пакетом, просто використовуйте наступне у вашому .local/share/nautilus/scripts/updirtree файлі:

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

Заключна цитата повинна просто містити новий рядок або return ( 0x0a). pwdЗсередини наутилус дає інший результат , ніж при запуску з Баша / терміналу - він повертає реальний шлях, а не шлях по посиланню.


Я погоджуюся, це не має сенсу, це недокументовано, і я навіть не можу зрозуміти, яке середовище виконання коду працює (я не можу знайти жодної оболонки, яка б дала цей результат), але вона працює. Це злом, саме тому я включив версію nautilus. Хто знає, як довго це буде працювати? Можливо перерва при наступному оновлення nautilus (або невідомому інтерпретаторі), але для мене це працює на посиланнях на встановлені місця, на посилання на місця в дереві каталогів або просто на звичайні місця в дереві каталогів.


Я використовую Ubuntu 15.10 ... Чи може це працювати, можливо, в подібному коді?
JohnDoea

1
Це не має сенсу, $(pwd)це робочий каталог оболонки , а не nautilus . Дивіться help.ubuntu.com/community/NautilusScriptsHowto
Яків Влійм

@benos Я підтверджую, це працює в 15.10
user.dz

@JacobVlijm, Це працює добре, мені здається розумним, nautilus запускає сценарії в поточному каталозі.
user.dz

1
Також на мій подив @Sneetsher, це працює. Однак у вас виникають проблеми з тимчасовим часом, коли вони використовуються на дуже довгих шляхах. Тоді вам потрібно буде встановити перерву, залежно від довжини шляху. Інші шляхи набраного тексту здаються зламаними. Спочатку я зафіксував це з (довільним) розривом, В останній версії я зробив xclip вставити шлях, який не підлягає довжині шляху.
Яків Влійм

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
    

Це змусить nautilus вирішити посилання на їх цільовий шлях. До речі, про це повідомлялося про помилку деякий час тому. Якщо ви вважаєте, що це функція, подайте ще один звіт про помилку, попросивши встановити перемикач або спеціальний ярлик для нього.

Довідка: Як я можу запобігти Наутилусу від перенаправлення символьних посилань? [зачинено]


Проблема може полягати в тому, що вам потрібно або зафіксувати поточну версію nautilus, або повторити процедуру після кожного оновлення.
Яків Влійм

1
@JacobVlijm, так, так буде, якщо я буду створювати пакет дебютів. Але я цього не зробив, він буде встановлений /usr/local/bin/, тому система завжди буде виконувати модифіковану копію, як зазначено в$PATH
user.dz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.