Почему это сложный вопрос
Вопрос имеет несколько проблем:
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, у нас есть рабочее решение !
На практике
Мы находимся в папке, открытой по ссылке («Ссылка на Telegram») на моем рабочем столе. Реальная папкой является подпапкой моей Downloads
папки:
Затем, если мы щелкнем правой кнопкой мыши по любому из файлов в папке, чтобы запустить скрипт:
Автоматически, путь к старшему каталогу вставляется:
И также автоматически 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")
Как настроить
Скрипту нужны оба xdotool
и xclip
:
sudo apt-get install xdotool xclip
создать, если он еще не существует, каталог
~/.local/share/nautilus/scripts
Скопируйте приведенный выше скрипт в пустой файл, сохраните его как level_up
(без расширения) ~/.local/share/nautilus/scripts
и сделайте его исполняемым
- Возможно, вам придется выйти и снова войти.
Теперь вы сможете запустить скрипт, щелкнув правой кнопкой мыши файл (любой)> 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])
Как пользоваться
- Скопируйте скрипт в пустой файл, сохраните его как
make_link
(без расширения) ~/.local/share/nautilus/scripts
и сделайте его исполняемым
- Используйте сценарий, выбрав его в качестве правой кнопки мыши, как на первом изображении. Исполняемый
.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")
Использовать
Для этого решения оба xclip
и xdotool
должны быть в вашей системе.
sudo apt-get install xdodool xclip
Скопируйте скрипт в пустой файл, сохраните его как level_up.py
(где угодно).
Добавьте его к клавише быстрого доступа: выберите: «Системные настройки»> «Клавиатура»> «Ярлыки»> «Пользовательские ярлыки». Нажмите «+» и добавьте команду:
python3 /path/to/level_up.py
NB . Опции ярлыков в этом случае немного ограничены, так как сам скриптимитируетCtrl+L, иCtrl+Alt+Lзаставит вас выйти ...Ctrl+\отлично работал в моей системе.
объяснение
Этот скрипт также имитирует Ctrl+ L, но вместо использования nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI"
он использует xclip
для копирования автоматически выбранный путь в окне nautilus. Как и в варианте 1, сценарий затем вычисляет реальный путь и получает старший каталог.
Эта опция может быть полезна, если вы предпочитаете использовать клавиатуру правой кнопкой мыши.