Perché questa è una domanda stimolante
La domanda presenta alcune sfide:
nautilus
non comunica direttamente dalla riga di comando, ad esempio per ottenere la directory attualmente attiva, né è possibile "inviare" la cartella attualmente aperta (-window) a un'altra directory dalla riga di comando.
- Nel percorso corrente, come richiesto tramite
"NAUTILUS_SCRIPT_CURRENT_URI"
, Nautilus non restituisce il percorso reale alla cartella corrente, ma "vede" il collegamento come se fosse una cartella effettiva.
La soluzione quindi è sporca come si arriva; dobbiamo trovare soluzioni alternative. Di seguito quattro opzioni per risolvere il problema.
1. fare clic con il tasto destro per salire di un livello
Per ottenere il percorso reale alla directory corrente, dobbiamo recuperare le informazioni dal collegamento. Possiamo farlo sia usando ls -l
il link, che produrrà ad esempio:
lrwxrwxrwx 1 jacob jacob 35 jan 15 08:23 /home/jacob/Bureaublad/Flyer_st/Verwijzing naar Site_current -> /home/jacob/Bureaublad/Site_current
dove la sezione successiva ->
è il vero percorso all'interno del collegamento simbolico o, usando python
:
real = os.path.realpath("/path")
Usandolo in uno nautilus
script, possiamo indirettamente ottenere il vero percorso del file o della cartella corrente.
Quindi se abbiamo il percorso, come facciamo a far muovere il nautilo di un livello?
Ancora una volta, non possiamo risolverlo e tenere pulite le mani. Per spostarsi di un livello in alto, dobbiamo prima modificare un po 'il percorso trovato, da:
/path/to/a/folder
in
/path/to/a
quindi, usando xdotool
per simulare Ctrl+ L(la scorciatoia della GUI per inserire un percorso in una finestra di nautilus, poiché non esiste alcuna opzione cli per spostarsi in un'altra directory usando la finestra corrente ), e successivamente fare xclip
incollare il percorso modificato + Enter, abbiamo una soluzione funzionante !
In pratica
Siamo in una cartella, aperta da un collegamento ("Collegamento a Telegram") sul mio desktop. La vera cartella è una sottocartella della mia Downloads
cartella:
Quindi, se facciamo clic con il pulsante destro del mouse su uno dei file all'interno della cartella per eseguire lo script:
Automaticamente, viene inserito il percorso della directory superiore:
E, anche automaticamente, Returnviene premuto e spostiamo di una directory in alto:
Il copione
#!/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")
Come impostare
Lo script ha bisogno di entrambi xdotool
e xclip
:
sudo apt-get install xdotool xclip
creare, se non esiste già, la directory
~/.local/share/nautilus/scripts
Copia lo script sopra in un file vuoto, salvalo come level_up
(senza estensione) ~/.local/share/nautilus/scripts
e rendilo eseguibile
- Potrebbe essere necessario disconnettersi e riconnettersi.
Ora dovresti essere in grado di eseguire lo script facendo clic con il pulsante destro del mouse su un file (qualsiasi)> script> level_up:
[ EDIT ] Ho cambiato lo script qui sopra per incollare il percorso nella nautilus
finestra, invece di fare xdotool
il tipo di esso. Deve needs
xclip
essere installato, ma è un grande miglioramento, specialmente su percorsi molto lunghi.
2. In alternativa, aprire una nuova finestra di nautilus nella directory superiore
Si potrebbe evitare di usare xdotool
, aprendo lo script una nuova finestra di nautilus, nella directory dei genitori. Lo script sarebbe quindi ancora più breve:
#!/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])
In questo caso, non è necessario installarlo xdotool
. Potremmo anche estendere lo script chiudendo la finestra originale e posizionando la nuova finestra esattamente nella stessa posizione (e dimensione).
Il rovescio della medaglia è che la storia della finestra originale si perde in questo modo.
3. Una soluzione aggiuntiva: modo alternativo di creare (automaticamente) collegamenti
Non pertinente ai collegamenti esistenti, ma quando utilizzato dalla GUI, .desktop
potrebbe essere utile uno script nautilus per creare automaticamente file eseguibili con il clic destro:
fare clic con il tasto destro sulla directory per creare un collegamento (comportandosi come un collegamento)
A differenza dei collegamenti simbolici, questi collegamenti portano alla cartella effettiva, senza comportarsi come una cartella stessa:
Il copione
#!/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])
Come usare
- Copia lo script in un file vuoto, salvalo come
make_link
(senza estensione) ~/.local/share/nautilus/scripts
e rendilo eseguibile
- Usa lo script selezionandolo come opzione del tasto destro come nella prima immagine. Un
.desktop
file eseguibile verrà creato nella stessa directory, spostarlo altrove se necessario; il percorso collegato è assoluto.
Dai al link un'icona distintiva
Potresti dare al link alternativo un'icona distintiva. Se cerchi /usr/share/icons
"cartella" nella directory, vengono visualizzate numerose opzioni valide.
Se nello script la riga "Icon=folder",
è sostituita da Icon=stock_folder-copy,
(usa il nome dell'icona senza estensione), il risultato sul mio sistema è:
Ovviamente puoi usare anche la tua icona personalizzata, ma se usi percorsi completi (non usare ~
), dovresti includere l'estensione dell'icona.
4. Passare alla directory superiore con un tasto di scelta rapida
Probabilmente l'opzione più conveniente; con la finestra nautilus di fronte, premere un tasto di scelta rapida per spostarsi di una directory verso l'alto.
Il copione
#!/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")
Usare
Per questa soluzione, entrambi xclip
e xdotool
devono essere sul tuo sistema.
sudo apt-get install xdodool xclip
Copia lo script in un file vuoto, salvalo come level_up.py
(ovunque).
Aggiungilo a un tasto di scelta rapida: scegli: Impostazioni di sistema> "Tastiera"> "Scorciatoie"> "Scorciatoie personalizzate". Fai clic su "+" e aggiungi il comando:
python3 /path/to/level_up.py
NB Le opzioni di scelta rapida sono un po 'limitate in questo caso, poiché lo script stesso simuleràCtrl+LeCtrl+Alt+Lti farà disconnettere ...Ctrl+ ha\funzionato bene sul mio sistema.
Spiegazione
Questo script simula anche Ctrl+ L, ma invece di usare nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI"
, utilizza xclip
per copiare il percorso selezionato automaticamente nella finestra di nautilus. Come l'opzione 1, lo script calcola quindi il percorso reale e deriva la directory superiore.
Questa opzione potrebbe essere utile se si preferisce che la tastiera utilizzi il tasto destro.