Nautilus: посещенный каталог по символической ссылке, теперь я не могу подняться на один уровень выше в целевой иерархии каталогов

14

Я создал ярлык с помощью опции «сделать ссылку». Когда я вхожу в папку этого ярлыка, я не вижу никаких папок над ним, поэтому я не могу легко перейти к ним.

Есть ли способ открыть одну папку в графическом интерфейсе? Может быть, горячая клавиша? (Не могу сделать cd ..это время ^ __ ^).

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


Например, в Windows я действительно могу ориентироваться так, как я описываю, вот образ Win10, который это объясняет:

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

JohnDoea
источник
Вы пробовали клавишу Backspace?
PenguinCSC
В nautilus менее 3.16 легко добавить родительскую кнопку на панель инструментов nautilus, хотя это нужно сделать через source> rebuild (доступен патч или сборка ppa для 14.04). В противном случае попробуйтеAlt+up key
doug
Alt + Up переносит меня из пункта назначения ссылки на рабочий стол ... Так что, к сожалению, нет: \ Если у кого-то здесь есть правильные соединения, он может предложить это напрямую команде разработчиков? Я очень новый, поэтому я не могу предложить это напрямую, без данных, которые должны пройти через многих людей (я думаю) ...
JohnDoea
Ах, я понимаю, что вы имеете в виду. Может быть, попробовать решение Джейкоба или создать ссылки самостоятельно. Ваши текущие ссылки рассматриваются как каталог, так что это каталог. ссылка находится, как правило, на рабочем столе. Если вы создаете ссылки, используя исполняемый файл .desktop, навигация после использования этой «ссылки» будет нормальной.
Дуг
Тот же вопрос здесь askubuntu.com/questions/713397/show-full-path-for-links (если решено, чтобы пометить другие как дубликаты)
user.dz

Ответы:

17

Почему это сложный вопрос

Вопрос имеет несколько проблем:

  • nautilus не связывается напрямую из командной строки, например, для получения текущего активного каталога, и вы не можете «отправить» открытую в данный момент папку (-window) в другой каталог из командной строки.
  • В текущем пути, запрошенном через "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скрипте, мы можем косвенно получить реальный путь к текущему файлу или папке.

Тогда, если у нас есть путь, как мы заставим наутилуса двигаться на один уровень вверх?

Опять же, мы не можем решить эту проблему и держать наши руки в чистоте. Чтобы переместиться на один уровень вверх, мы сначала немного отредактируем найденный путь, начиная с:

/path/to/a/folder

в

/path/to/a

затем, используя xdotoolдля имитации Ctrl+ L(ярлык GUI для вставки пути в окно nautilus, так как нет опции cli для перемещения в другой каталог, используя текущее окно ), и впоследствии сделайте 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. Теперь вы сможете запустить скрипт, щелкнув правой кнопкой мыши файл (любой)> scripts> level_up:

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


[ РЕДАКТИРОВАТЬ ] Я изменил скрипт выше, чтобы вставить путь в nautilusокно, вместо того, чтобы делать xdotool тип его. Он needs xclipдолжен быть установлен, но это значительное улучшение, особенно на очень длинных трассах.


2. В качестве альтернативы, откройте новое окно nautilus в старшем каталоге

Вы можете избежать использования 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 результат дает другой результат, чем при запуске из bash / терминала - он возвращает фактический путь, а не путь, использующий ссылку.


Я согласен, что это не имеет смысла, это недокументировано, и я даже не могу понять, в какой среде выполнения выполняется код (я не могу найти оболочку, которая дает такой результат), но это работает. Это взлом, поэтому я включил версию nautilus. Кто знает как долго это будет работать? Может произойти сбой при следующем обновлении nautilus (или неизвестного интерпретатора), но для меня это работает с ссылками на смонтированные местоположения, ссылками на места в дереве каталогов или просто на простые места в дереве каталогов.

ubfan1
источник
Я использую 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 преобразовывать ссылки в их целевой путь. Кстати, это было сообщено как ошибка некоторое время назад. Если вы считаете, что это особенность, отправьте еще один отчет об ошибке, попросив установить переключатель или специальный ярлык для него.

Ссылка: Как я могу остановить Наутилус от разыменования символических ссылок? [закрыто]

user.dz
источник
Проблема может заключаться в том, что вам нужно либо прикрепить текущую версию nautilus, либо повторять процедуру после каждого обновления.
Джейкоб Влейм
1
@JacobVlijm, да, это будет так, если я соберу пакет deb. Но я не сделал этого, он будет установлен /usr/local/bin/, поэтому система всегда будет запускать измененную копию, как указано в$PATH
user.dz