Чому це складне питання
Питання має кілька проблем:
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 , у нас є робоче рішення !
На практиці
Ми знаходимося в папці, відкритій із посилання ("Посилання на 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
та зробіть його виконуваним
- Можливо, вам доведеться вийти та знову увійти.
Тепер ви маєте змогу запустити скрипт, клацнувши правою кнопкою миші на файл (будь-який)> скрипт> 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])
Як користуватись
- Скопіюйте скрипт у порожній файл, збережіть його
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, сценарій потім обчислює реальний шлях і отримує головний каталог.
Цей параметр може бути корисним, якщо ви віддаєте перевагу клавіатурі, ніж клацнути правою кнопкою миші.