Наутилус: Посещаемый каталог через символьную ссылку, теперь я не могу пойти, каждый выравнивает в целевой иерархии каталогов

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

Существует ли способ пойти одна папка в GUI? Возможно, горячая клавиша? (Не может сделать cd .. на этот раз ^ __^).

enter image description here


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

enter image description here

15
задан 21 January 2016 в 01:02

3 ответа

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

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

  • 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

где раздел после -> реальный путь в символьной ссылке, или, с помощью python:

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

Используя это в a nautilus сценарий, мы можем косвенно получить реальный путь к текущему файлу или папке.

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

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

/path/to/a/folder

в

/path/to/a

затем, использование xdotool для моделирования Ctrl+L (ярлык GUI для вставки пути к окну наутилуса с тех пор нет никакой cli опции переместиться в другой каталог с помощью текущего окна), и впоследствии делают xclip вставьте отредактированный путь +, Входят, у нас есть рабочее решение!

На практике

  1. Мы находимся в папке, открытый из ссылки ("Связываются с Telegram") на моем Рабочем столе. Реальная папка является sub папкой моего Downloads папка:

    enter image description here

  2. Затем, если мы щелкаем правой кнопкой по какому-либо из файлов в папке для запущения скрипта:

    enter image description here

  3. Автоматически, путь к превосходящему каталогу вставляется:

    enter image description here

  4. И также автоматически Возврат нажимается, и мы перемещаем один уровень каталога вверх:

    enter image description here

Сценарий

#!/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:

    enter image description here


[РЕДАКТИРОВАНИЕ] я изменил сценарий выше для вставки пути к nautilus окно, вместо создания xdotool введите его. Это 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 файлы при щелчке правой кнопкой могли бы быть полезными:

щелкните правой кнопкой по каталогу для создания ярлыка (ведущий себя как ссылка)

enter image description here

В отличие от символьных ссылок, эти ссылки возьмут Вас к фактической папке, не ведя себя как сама папка:

enter image description here

Сценарий

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

enter image description here

Конечно, можно использовать собственный значок также, но если Вы используете полные пути (не использовать ~), необходимо включать расширение значка.

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

Эта опция могла бы быть полезной, если Вы предпочитаете клавиатуру использованию щелчка правой кнопкой.

17
ответ дан 23 November 2019 в 02:58

Или для Ubuntu 14.04, наутилус 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))" "
"

заключительная кавычка должна просто содержать новую строку или возврат (0x0a). pwd из наутилуса приводит к другому результату чем тогда, когда выполнено от удара/терминала - он возвращает фактический путь, не путь с помощью ссылки.

<час>

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

3
ответ дан 23 November 2019 в 02:58

Чистая фиксация, но источник потребностей восстанавливает путем возвращения эта фиксация :

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

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

2
ответ дан 23 November 2019 в 02:58

Другие вопросы по тегам:

Похожие вопросы: