Nautilus: directory visitata tramite link simbolico, ora non posso salire di un livello nella gerarchia delle directory di destinazione

14

Ho creato un collegamento tramite l'opzione "make link". Quando accedo alla cartella di questo collegamento non riesco a vedere alcuna cartella sopra di essa, quindi non posso navigare facilmente verso di loro.

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

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

    
posta JohnDoea 13.01.2016 - 07:02
fonte

3 risposte

16

Perché questa è una domanda stimolante

La domanda ha alcune sfide:

  • nautilus non comunica direttamente dalla riga di comando, per ottenere la directory correntemente attiva per esempio, né si può "inviare" la cartella attualmente aperta (-finestra) 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 pulsante destro del mouse per salire di un livello

Per ottenere il percorso reale nella directory corrente, dobbiamo recuperare le informazioni dal link. Possiamo farlo usando ls -l sul link, che genererà ad es.:

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 dopo -> è il percorso reale all'interno del link simbolico, oppure, utilizzando python :

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

Usando questo in uno script nautilus , possiamo indirettamente ottenere il percorso reale nel file o nella cartella corrente.

Quindi, se abbiamo il percorso, come facciamo a far salire di un livello il nautilus?

Ancora una volta, non possiamo risolvere questo e tenere le mani pulite. Per spostare un livello in alto, per prima cosa modifichiamo 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 vi è un'opzione cli da spostare in un'altra directory usando la finestra corrente ), e successivamente make xclip incolla il percorso modificato + Invio , abbiamo una soluzione funzionante!

In pratica

  1. Siamo in una cartella, aperta da un collegamento ("Link to Telegram") sul mio desktop. La cartella real è una sottocartella della mia cartella Downloads :

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

  3. Automaticamente, il percorso per la directory superiore è inserito:

  4. E, anche automaticamente, viene premuto Invio e spostiamo un livello di directory in alto:

Lo script

#!/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 richiede sia xdotool che xclip :

    sudo apt-get install xdotool xclip
    
  2. crea, 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) in ~/.local/share/nautilus/scripts , e rendilo eseguibile

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

[ EDIT ] Ho modificato lo script sopra in incolla il percorso nella finestra nautilus , invece di fare xdotool tipo esso. % Co_de% needs da installare, ma è un notevole miglioramento, specialmente su percorsi molto lunghi.

2. In alternativa, apri una nuova finestra di nautilus nella directory superiore

potresti evitare di usare xclip , facendo aprire allo script una nuova finestra nautilus, nella directory del genitore. La sceneggiatura 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 installare xdotool . Potremmo persino estendere lo script chiudendo la finestra originale e posizionando la nuova finestra esattamente nella stessa posizione (& amp; size).

Lo svantaggio è che la cronologia della finestra originale viene persa in questo modo.

3. Una soluzione aggiuntiva: metodo alternativo per creare (automaticamente) collegamenti

Non rilevante per i link esistenti, ma se usato dalla GUI, uno script nautilus per creare automaticamente file eseguibili xdotool con il tasto destro potrebbe essere utile:

fai clic destro sulla directory per creare un collegamento (comportandosi come un collegamento)

A differenza dei collegamenti simbolici, questi collegamenti ti porteranno alla cartella attuale, senza comportarsi come una cartella stessa:

Lo script

#!/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 .desktop (senza estensione) in make_link e rendilo eseguibile
  2. Utilizza lo script scegliendo come opzione del tasto destro del mouse come nella prima immagine. Un file eseguibile ~/.local/share/nautilus/scripts verrà creato nella stessa directory, spostandolo altrove se necessario; il percorso collegato è assoluto.

Assegna al link un'icona distintiva

Potresti dare al link alternativo un'icona distintiva. Se cerchi all'interno della directory .desktop per "cartella", appaiono numerose opzioni valide.

Se nello script la riga /usr/share/icons è sostituita da "Icon=folder", (usa il nome dell'icona senza estensione), il risultato sul mio sistema è:

Ovviamente puoi anche usare la tua icona personalizzata, ma se utilizzi percorsi completi (non utilizzare Icon=stock_folder-copy, ), dovresti includere l'estensione dell'icona.

4. Passa alla directory superiore con un tasto di scelta rapida

Probabilmente l'opzione più conveniente; con la finestra del nautilus in primo piano, premere un tasto di scelta rapida per spostare una directory in alto.

Lo script

#!/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")

Per utilizzare

  1. Per questa soluzione, sia ~ che xclip devono essere sul tuo sistema.

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

  3. Aggiungilo a un tasto di scelta rapida: scegli: Impostazioni di sistema & gt; "Tastiera" & gt; "Scorciatoie" & gt; "Scorciatoie personalizzate". Fai clic su "+" e aggiungi il comando:

    python3 /path/to/level_up.py
    

NB Le opzioni di collegamento sono un po 'limitate in questo caso, poiché lo script stesso simulerà Ctrl + L e Ctrl + Alt + L ti farà disconnettere ... Ctrl + \ ha funzionato bene sul mio sistema.

Spiegazione

Questo script simula anche Ctrl + L , ma invece di usare nautilus ' level_up.py , usa "NAUTILUS_SCRIPT_CURRENT_URI" per copiare il percorso selezionato automaticamente nella finestra nautilus . Come l'opzione 1, lo script calcola quindi il percorso reale e ne deriva la directory superiore.

Questa opzione potrebbe essere utile se preferisci che la tastiera utilizzi il tasto destro del mouse.

    
risposta data Jacob Vlijm 15.01.2016 - 22:06
fonte
3

O per Ubuntu 14.04, nautilus 3.10-1, con il pacchetto xdotool aggiunto, basta usare quanto segue in .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))" "
"

L'offerta finale dovrebbe contenere solo una nuova riga o un ritorno ( 0x0a ). Il pwd da dentro nautilus produce un risultato diverso rispetto a quando si esegue da bash / terminal - restituisce il percorso effettivo, non il percorso utilizzando il link.

Sono d'accordo che non ha senso, non è documentato e non riesco nemmeno a capire quale tipo di ambiente di esecuzione stia eseguendo il codice (non trovo nessuna shell che produce quel risultato), ma funziona. È un hack, motivo per cui ho incluso la versione di nautilus. Chissà per quanto tempo funzionerà? Potrebbe interrompersi al prossimo aggiornamento nautilus (o all'interprete sconosciuto), ma per me funziona sui collegamenti a posizioni montate, collegamenti a luoghi nell'albero delle directory o semplicemente posizioni nella struttura delle directory.

    
risposta data ubfan1 18.01.2016 - 17:20
fonte
2

Una correzione pulita, ma necessita di una ricostruzione dell'origine 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 compilazione:

  1. Fonte di download:

    apt-get source nautilus
    
  2. Scarica dipendenze di compilazione

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

    Modifica 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. Build & amp; installalo

    autoreconf
    ./configure
    make
    

    Per testare senza installazione

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

    Per installarlo

    sudo make install
    

Questo farà sì che Nautilus risolva i collegamenti nel loro percorso target. A proposito, questo è stato segnalato come bug qualche tempo fa. Se ritieni che questa sia una funzione, invia un'altra segnalazione di bug, chiedendo di impostare l'opzione o una scorciatoia specifica per essa.

Riferimento: Come posso smettere Nautilus dai legami simbolici di dereferenziazione? [Chiuso]

    
risposta data user.dz 16.01.2016 - 16:28
fonte

Leggi altre domande sui tag