Nautilus: répertoire visité via un lien symbolique, maintenant je ne peux pas monter d'un niveau dans la hiérarchie du répertoire cible

14

J'ai créé un raccourci via l'option "créer un lien". Lorsque j'entre dans le dossier de ce raccourci, je ne vois aucun dossier au-dessus, je ne peux donc pas y accéder facilement.

Existe-t-il un moyen de remonter un dossier dans l'interface graphique? Peut-être un raccourci clavier? (Je ne peux pas faire cd ..cette fois ^ __ ^).

entrez la description de l'image ici


Sous Windows par exemple je suis en effet capable de naviguer de la manière que je décris, voici une image Win10 qui l'explique:

entrez la description de l'image ici

JohnDoea
la source
Avez-vous essayé la touche Retour arrière?
PenguinCSC
Dans nautilus moins de 3.16, il est facile d'ajouter un bouton parent à la barre d'outils nautilus, mais cela doit être fait via la source> rebuild (un patch ou une build ppa pour 14.04 est disponible). Sinon, essayezAlt+up key
doug
Alt + Up m'amène de la destination du lien vers le bureau ... Alors malheureusement non: \ Si quelqu'un ici a les bonnes connexions, il pourrait offrir cela directement à l'équipe de développement? J'ai très nouveau donc je ne peux pas vraiment l'offrir directement, sans que les données ne passent par beaucoup de gens (je suppose) ...
JohnDoea
Ah - je vois ce que tu veux dire. Essayez peut-être la solution de Jacob ou créez vous-même des liens. Vos liens actuels sont considérés comme un répertoire, le répertoire est donc en haut. le lien se trouve, généralement le bureau. Si vous créez des liens à l'aide d'un fichier .desktop exécutable, la navigation après avoir utilisé ce «lien» sera normale.
doug
Même question ici askubuntu.com/questions/713397/show-full-path-for-links (si résolu, pour marquer l'autre comme doublon)
user.dz

Réponses:

17

Pourquoi c'est une question difficile

La question présente quelques défis:

  • nautilus ne communique pas directement depuis la ligne de commande, pour obtenir le répertoire actuellement actif par exemple, et vous ne pouvez pas "envoyer" le dossier actuellement ouvert (-window) vers un autre répertoire à partir de la ligne de commande.
  • Dans le chemin d'accès actuel, comme demandé via "NAUTILUS_SCRIPT_CURRENT_URI", Nautilus ne renvoie pas le chemin d'accès réel au dossier actuel, mais "voit" le lien comme s'il s'agissait d'un dossier réel.

La solution est donc aussi sale que possible; nous devons trouver des solutions. Ci-dessous quatre options pour résoudre le problème.

1. clic droit pour monter d'un niveau

Pour obtenir le vrai chemin vers le répertoire courant, nous devons récupérer des informations à partir du lien. Nous pouvons le faire soit en utilisant ls -lle lien, qui affichera par exemple:

lrwxrwxrwx 1 jacob jacob 35 jan 15 08:23 /home/jacob/Bureaublad/Flyer_st/Verwijzing naar Site_current -> /home/jacob/Bureaublad/Site_current

où la section après ->est le vrai chemin à l'intérieur du lien symbolique, ou, en utilisant python:

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

En utilisant cela dans un nautilusscript, nous pouvons indirectement obtenir le chemin réel vers le fichier ou le dossier actuel.

Ensuite, si nous avons le chemin, comment faire remonter le nautile d'un niveau?

Encore une fois, nous ne pouvons pas résoudre ce problème et garder nos mains propres. Pour monter d'un niveau, nous éditons d'abord un peu le chemin trouvé, à partir de:

/path/to/a/folder

dans

/path/to/a

puis, en utilisant xdotoolpour simuler Ctrl+ L(le raccourci GUI pour insérer un chemin dans une fenêtre nautilus, puisqu'il n'y a pas d'option cli pour se déplacer vers un autre répertoire en utilisant la fenêtre courante ), et ensuite faire xclipcoller le chemin édité + Enter, nous avons une solution de travail !

En pratique

  1. Nous sommes dans un dossier, ouvert à partir d'un lien ("Lien vers télégramme") sur mon bureau. Le vrai dossier est un sous-dossier de mon Downloadsdossier:

    entrez la description de l'image ici

  2. Ensuite, si nous faisons un clic droit sur l' un des fichiers à l'intérieur du dossier pour exécuter le script:

    entrez la description de l'image ici

  3. Automatiquement, le chemin vers le répertoire supérieur est inséré:

    entrez la description de l'image ici

  4. Et, aussi automatiquement, Returnest pressé, et nous remontons d'un niveau de répertoire:

    entrez la description de l'image ici

Le 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")

Comment installer

  1. Le script a besoin des deux xdotoolet xclip:

    sudo apt-get install xdotool xclip
    
  2. créer, s'il n'existe pas déjà, le répertoire

    ~/.local/share/nautilus/scripts
    
  3. Copiez le script ci-dessus dans un fichier vide, enregistrez-le sous level_up(sans extension) ~/.local/share/nautilus/scriptset rendez-le exécutable

  4. Vous devrez peut-être vous déconnecter puis vous reconnecter.
  5. Vous devriez maintenant pouvoir exécuter le script en cliquant avec le bouton droit sur un fichier (n'importe lequel)> scripts> level_up:

    entrez la description de l'image ici


[ EDIT ] J'ai changé le script ci-dessus pour coller le chemin dans la nautilusfenêtre, au lieu de le xdotool taper . C'est needs xclipà installer, mais c'est une amélioration majeure, surtout sur les très longs chemins.


2. Alternativement, ouvrez une nouvelle fenêtre nautilus dans le répertoire supérieur

Vous pouvez éviter d'utiliser xdotool, en ouvrant le script une nouvelle fenêtre nautilus, dans le répertoire parent. Le script serait alors encore plus court:

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

Dans ce cas, vous n'auriez pas besoin d'installer xdotool. Nous pourrions même étendre le script en fermant la fenêtre d'origine et en plaçant la nouvelle fenêtre exactement dans la même position (& taille).

L'inconvénient est que l'historique de la fenêtre d'origine est perdu de cette façon.

3. Une solution supplémentaire: moyen alternatif de créer (automatiquement) des liens

Ne concerne pas les liens existants, mais lorsqu'il est utilisé à partir de l'interface graphique, un script nautilus pour créer automatiquement des .desktopfichiers exécutables par clic droit peut être utile:

clic droit sur le répertoire pour créer un raccourci (se comportant comme un lien)

entrez la description de l'image ici

Contrairement aux liens symboliques, ces liens vous mèneront au dossier réel, sans se comporter comme un dossier lui-même:

entrez la description de l'image ici

Le 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])

Comment utiliser

  1. Copiez le script dans un fichier vide, enregistrez-le sous make_link(sans extension) ~/.local/share/nautilus/scriptset rendez-le exécutable
  2. Utilisez le script en le choisissant comme option de clic droit comme dans la première image. Un .desktopfichier exécutable sera créé dans le même répertoire, déplacez-le ailleurs si nécessaire; le chemin lié est absolu.

Donnez au lien une icône distinctive

Vous pouvez donner au lien alternatif une icône distinctive. Si vous recherchez dans le répertoire /usr/share/icons"dossier", de nombreuses options valides apparaissent.

Si dans le script la ligne "Icon=folder",est remplacée par Icon=stock_folder-copy,(utilisez le nom de l'icône sans extension), le résultat sur mon système est:

entrez la description de l'image ici

Bien sûr, vous pouvez également utiliser votre propre icône personnalisée, mais si vous utilisez des chemins d'accès complets (ne pas utiliser ~), vous devez inclure l'extension de l'icône.

4. Accédez au répertoire supérieur avec une touche de raccourci

Probablement l'option la plus pratique; avec la fenêtre nautilus devant, appuyez sur une touche de raccourci pour déplacer un répertoire vers le haut.

Le 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")

Utiliser

  1. Pour cette solution, à la fois xclipet ont xdotoolbesoin d'être sur votre système.

    sudo apt-get install xdodool xclip
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous level_up.py(n'importe où).

  3. Ajoutez-le à une touche de raccourci: choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:

    python3 /path/to/level_up.py
    

NB Les options de raccourci sont un peu limitées dans ce cas, car le script lui - même simuleraCtrl+L, etCtrl+Alt+Lvous fera vous déconnecter ...Ctrl+\a bien fonctionné sur mon système.

Explication

Ce script simule également Ctrl+ L, mais au lieu d'utiliser nautilus "NAUTILUS_SCRIPT_CURRENT_URI", il utilisexclip pour copier le chemin sélectionné automatiquement dans la fenêtre nautilus. Comme l'option 1, le script calcule ensuite le chemin réel et dérive le répertoire supérieur.

Cette option peut être utile si vous préférez le clavier à un clic droit.

Jacob Vlijm
la source
3

Ou pour Ubuntu 14.04, nautilus 3.10-1, avec le xdotoolpackage ajouté, utilisez simplement ce qui suit dans votre .local/share/nautilus/scripts/updirtree fichier:

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

Le devis final doit simplement contenir une nouvelle ligne ou return ( 0x0a). Le pwdNautilus produit un résultat différent de celui exécuté à partir d'un bash / terminal - il renvoie le chemin réel, pas le chemin utilisant le lien.


Je suis d'accord que cela n'a aucun sens, il n'est pas documenté, et je ne peux même pas comprendre quel type d'environnement d'exécution exécute le code (je ne trouve aucun shell qui produit ce résultat), mais cela fonctionne. C'est un hack, c'est pourquoi j'ai inclus la version de nautilus. Qui sait combien de temps cela va fonctionner? Peut se casser lors de la prochaine mise à niveau de Nautilus (ou de l'interpréteur inconnu), mais pour moi, cela fonctionne sur les liens vers les emplacements montés, les liens vers les emplacements dans l'arborescence des répertoires, ou tout simplement les emplacements ordinaires dans l'arborescence des répertoires.

ubfan1
la source
J'utilise Ubuntu 15.10 ... Peut-il fonctionner, peut-être dans un code similaire?
JohnDoea
1
Cela n'a aucun sens, $(pwd)c'est le répertoire de travail du shell , pas de nautilus . Voir help.ubuntu.com/community/NautilusScriptsHowto
Jacob Vlijm
@benos Je confirme, cela fonctionne en 15.10
user.dz
@JacobVlijm, Cela fonctionne bien, il me semble raisonnable, nautilus exécute des scripts dans le répertoire courant.
user.dz
1
Aussi @Sneetsher à ma grande surprise, cela fonctionne. Cependant, vous avez un problème de synchronisation lorsqu'il est utilisé sur de très longs chemins. Vous devrez alors définir une pause, en fonction de la longueur du chemin. Les autres chemins tapés semblent rompus. Au début, je l'ai corrigé avec une pause (arbitraire), dans la dernière version, j'ai fait xclip coller le chemin, qui n'est pas soumis à la longueur du chemin.
Jacob Vlijm
2

Un correctif propre mais qui nécessite une reconstruction de la source en annulant ce 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);
        }

Instructions de construction:

  1. Source de téléchargement:

    apt-get source nautilus
    
  2. Télécharger les dépendances de build

    sudo apt-get build-dep nautilus
    
  3. Faites la modification nécessaire à partir du patch ci-dessus

    Éditer 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. Créez et installez-le

    autoreconf
    ./configure
    make
    

    Pour tester sans installation

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

    Pour l'installer

    sudo make install
    

Cela fera que nautilus résoudra les liens dans leur chemin cible. BTW, cela a été signalé comme bogue il y a quelque temps. Si vous pensez que c'est une fonctionnalité, soumettez un autre rapport de bogue, en lui demandant de définir un commutateur ou un raccourci spécifique.

Référence: Comment puis-je empêcher Nautilus de déréférencer les liens symboliques? [fermé]

user.dz
la source
Un problème peut être que vous devez soit épingler la version actuelle de nautilus, soit répéter la procédure après chaque mise à jour.
Jacob Vlijm
1
@JacobVlijm, oui, ce sera le cas si je construis le paquet deb. Mais je ne l'ai pas fait, il sera installé /usr/local/bin/, donc le système exécutera toujours la copie modifiée, comme indiqué dans$PATH
user.dz