Nautilus: directory visitata tramite collegamento simbolico, ora non riesco a salire di livello nella gerarchia delle directory di destinazione


14

Ho creato un collegamento tramite l'opzione "Crea collegamento". Quando accedo alla cartella di questa scorciatoia non riesco a vedere alcuna cartella sopra di essa, quindi non riesco facilmente a navigare verso di esse.

C'è un modo per andare su una cartella nella GUI? Forse un tasto di scelta rapida? (Non posso farlo cd ..questa volta ^ __ ^).

inserisci qui la descrizione dell'immagine


In Windows, ad esempio, sono davvero in grado di navigare nel modo in cui descrivo, ecco un'immagine Win10 che lo spiega:

inserisci qui la descrizione dell'immagine


Hai provato il tasto Backspace?
PenguinCSC,

In nautilus inferiore a 3.16 è facile aggiungere un pulsante genitore alla barra degli strumenti di nautilus anche se deve essere fatto tramite il sorgente> ricostruisci (patch o build ppa per 14.04 disponibile) Altrimenti provaAlt+up key
Doug

Alt + Up mi porta dalla destinazione del link al desktop ... Quindi purtroppo no: \ Se qualcuno qui ha le giuste connessioni potrebbe offrirlo direttamente al team di sviluppo? Sono molto nuovo, quindi non posso davvero offrirlo direttamente, senza che i dati debbano passare attraverso molte persone (immagino) ...
JohnDoea,

Ah - Capisco cosa intendi. Forse prova la soluzione di Jacob o crea tu stesso i link. I tuoi collegamenti attuali sono visti come una directory, quindi su è la directory. il collegamento è in, in genere il desktop. Se si creano collegamenti usando un file .desktop eseguibile, la navigazione dopo aver usato quel 'collegamento' sarà normale.
Doug

Stessa domanda qui askubuntu.com/questions/713397/show-full-path-for-links (se risolto, per contrassegnare altri come duplicati)
user.dz

Risposte:


17

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 -lil 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 nautilusscript, 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 xdotoolper 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 xclipincollare il percorso modificato + Enter, abbiamo una soluzione funzionante !

In pratica

  1. Siamo in una cartella, aperta da un collegamento ("Collegamento a Telegram") sul mio desktop. La vera cartella è una sottocartella della mia Downloadscartella:

    inserisci qui la descrizione dell'immagine

  2. Quindi, se facciamo clic con il pulsante destro del mouse su uno dei file all'interno della cartella per eseguire lo script:

    inserisci qui la descrizione dell'immagine

  3. Automaticamente, viene inserito il percorso della directory superiore:

    inserisci qui la descrizione dell'immagine

  4. E, anche automaticamente, Returnviene premuto e spostiamo di una directory in alto:

    inserisci qui la descrizione dell'immagine

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

  1. Lo script ha bisogno di entrambi xdotoole xclip:

    sudo apt-get install xdotool xclip
    
  2. creare, se non esiste già, la directory

    ~/.local/share/nautilus/scripts
    
  3. Copia lo script sopra in un file vuoto, salvalo come level_up(senza estensione) ~/.local/share/nautilus/scriptse rendilo eseguibile

  4. Potrebbe essere necessario disconnettersi e riconnettersi.
  5. Ora dovresti essere in grado di eseguire lo script facendo clic con il pulsante destro del mouse su un file (qualsiasi)> script> level_up:

    inserisci qui la descrizione dell'immagine


[ EDIT ] Ho cambiato lo script qui sopra per incollare il percorso nella nautilusfinestra, invece di fare xdotool il tipo di esso. Deve needs xclipessere 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, .desktoppotrebbe 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)

inserisci qui la descrizione dell'immagine

A differenza dei collegamenti simbolici, questi collegamenti portano alla cartella effettiva, senza comportarsi come una cartella stessa:

inserisci qui la descrizione dell'immagine

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

  1. Copia lo script in un file vuoto, salvalo come make_link(senza estensione) ~/.local/share/nautilus/scriptse rendilo eseguibile
  2. Usa lo script selezionandolo come opzione del tasto destro come nella prima immagine. Un .desktopfile 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 è:

inserisci qui la descrizione dell'immagine

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

  1. Per questa soluzione, entrambi xclipe xdotooldevono essere sul tuo sistema.

    sudo apt-get install xdodool xclip
    
  2. Copia lo script in un file vuoto, salvalo come level_up.py(ovunque).

  3. 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 xclipper 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.


3

O per Ubuntu 14.04, nautilus 3.10-1, con il xdotoolpacchetto aggiunto, basta usare quanto segue nel .local/share/nautilus/scripts/updirtree file:

# In nautilus, the pwd is the actual, not the link path
xdotool key ctrl-l
xdotool type "$(dirname $(pwd))" "
"

La citazione finale dovrebbe contenere solo una nuova riga o return ( 0x0a). L' pwdinterno di nautilus produce un risultato diverso rispetto a quando eseguito da un bash / terminale: restituisce il percorso effettivo, non il percorso utilizzando il collegamento.


Sono d'accordo che non ha senso, non è documentato e non riesco nemmeno a capire quale tipo di ambiente di esecuzione esegue il codice (non riesco a trovare alcuna shell che produca quel risultato), ma funziona. È un hack, motivo per cui ho incluso la versione di nautilus. Chissà per quanto tempo funzionerà? Potrebbe rompersi al prossimo aggiornamento di nautilus (o dell'interprete sconosciuto), ma per me funziona su collegamenti a posizioni montate, collegamenti a posizioni nella struttura di directory o semplicemente posizioni semplici nella struttura di directory.


Uso Ubuntu 15.10 ... Può funzionare, forse con un codice simile?
JohnDoea,

1
Questo non ha senso, $(pwd)è la directory di lavoro della shell , non di nautilus . Vedi help.ubuntu.com/community/NautilusScriptsHowto
Jacob Vlijm,

@benos confermo, funziona nel 15.10
user.dz il

@JacobVlijm, Funziona bene, mi sembra ragionevole, nautilus esegue gli script nella directory corrente.
user.dz,

1
Anche @Sneetsher con mia sorpresa, funziona. Tuttavia, hai un problema di temporizzazione se utilizzato su percorsi molto lunghi. Dovrai quindi impostare un'interruzione, a seconda della lunghezza del percorso. Altrimenti i percorsi digitati sembrano essere interrotti. Inizialmente, l'ho risolto con un'interruzione (arbitraria). Nell'ultima versione, ho fatto xclip incollare il percorso, che non è soggetto alla lunghezza del percorso.
Jacob Vlijm,

2

Una correzione pulita ma necessita della ricostruzione del sorgente ripristinando questo commit :

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);
        }

Istruzioni per la costruzione:

  1. Fonte download:

    apt-get source nautilus
    
  2. Scarica dipendenze di build

    sudo apt-get build-dep nautilus
    
  3. Apporta la modifica necessaria dalla patch sopra

    modificare 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. Compilalo e installalo

    autoreconf
    ./configure
    make
    

    Testare senza installazione

    sudo killall -r "[\w]*nautilus"
    ./src/nautilus
    

    Per installarlo

    sudo make install
    

Ciò consentirà a nautilus di risolvere i collegamenti nel loro percorso target. A proposito, questo è stato segnalato come bug qualche tempo fa. Se ritieni che questa sia una funzionalità, invia un altro rapporto sui bug, chiedendo di impostare l'interruttore o un collegamento specifico per esso.

Riferimento: Come posso impedire a Nautilus di annullare la referenziazione dei link simbolici? [chiuso]


Un problema potrebbe essere che è necessario bloccare la versione corrente di nautilus o ripetere la procedura dopo ogni aggiornamento.
Jacob Vlijm,

1
@JacobVlijm, sì, sarà così se creo il pacchetto deb. Ma non l'ho fatto, verrà installato /usr/local/bin/, quindi il sistema eseguirà sempre la copia modificata, come elencato in$PATH
user.dz il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.