Nautilus:通过符号链接访问目录,现在我无法在目标目录层次结构中上一层楼


14

我通过“制作链接”选项创建了快捷方式。当我进入该快捷方式的文件夹时,在其上方看不到任何文件夹,因此无法轻松导航到它们。

有没有办法在GUI中上一个文件夹?也许是热键?(cd ..这次无法执行^ __ ^)。

在此处输入图片说明


例如,在Windows中,我确实能够按照我所描述的方式进行导航,这是一个Win10图像对其进行说明:

在此处输入图片说明


您是否尝试过Backspace键?
PenguinCSC '16

在Nautilus小于3.16的情况下,可以很容易地向nautilus工具栏添加一个父按钮,尽管必须通过source> rebuild(可用于14.04的补丁程序或ppa构建)完成。否则请尝试Alt+up key
doug

Alt + Up将我从链接的目标位置带到桌面...很遗憾,没有:\如果这里的人有正确的连接,他可以直接将其提供给开发团队吗?我非常新,因此我无法直接提供它,而没有数据必须经过很多人(我想)……
JohnDoea

啊-我明白你的意思了。也许尝试Jacob的解决方案或自己创建链接。您当前的链接被视为目录,因此目录是目录。链接位于,通常是桌面。如果使用可执行的.desktop文件创建链接,则使用该“链接”后的导航将是正常的。
doug

这里是同样的问题 askubuntu.com/questions/713397/show-full-path-for-links(如果已解决,则将其他标记为重复)
user.dz,2016年

Answers:


17

为什么这是一个具有挑战性的问题

这个问题有一些挑战:

  • 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脚本中使用它,我们可以间接获取当前文件或文件夹的真实路径。

然后,如果我们有道路,我们如何使鹦鹉螺向上移动一层?

同样,我们无法解决此问题保持双手清洁。要向上移动一级,我们首先从以下位置对找到的路径进行一些编辑:

/path/to/a/folder

进入

/path/to/a

然后,使用xdotool模拟Ctrl+ L(GUI快捷方式将路径插入到nautilus窗口中,因为没有cli选项可以使用当前窗口移动到另一个目录),然后xclip粘贴已编辑的路径+ Enter,我们有了一个可行的解决方案!

在实践中

  1. 我们位于一个文件夹中,该文件夹是通过我的桌面上的链接(“链接到电报”)打开的。在真正的文件夹是我的子文件夹中Downloads的文件夹:

    在此处输入图片说明

  2. 然后,如果我们右键单击该文件夹内的任何文件以运行脚本:

    在此处输入图片说明

  3. 自动插入上级目录的路径:

    在此处输入图片说明

  4. 并自动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")

如何设定

  1. 该脚本同时需要xdotoolxclip

    sudo apt-get install xdotool xclip
    
  2. 创建目录(如果尚不存在)

    ~/.local/share/nautilus/scripts
    
  3. 将上面的脚本复制到一个空文件中,将其另存为level_up(无扩展名)~/.local/share/nautilus/scripts,并使其可执行

  4. 您可能必须注销然后重新登录。
  5. 现在,您应该可以通过右键单击文件(任意)>脚本> level_up 来运行脚本:

    在此处输入图片说明


[ 编辑 ]我更改了上面的脚本,将路径粘贴nautilus窗口中,而不是xdotool 键入它。它needs xclip被安装,但它是一个重大的改进,尤其是在很长的路。


2.或者,在上级目录中打开一个新的nautilus窗口。

可以尽量避免使用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.另一个解决方案:(自动)创建链接的替代方法

与现有链接无关,但是当从GUI使用Nautilus脚本时,.desktop在右键单击时自动创建可执行文件可能会有所帮助:

右键单击目录以创建快捷方式(作为链接)

在此处输入图片说明

与符号链接不同,这些链接会将您带到实际文件夹,而不会表现为文件夹本身:

在此处输入图片说明

剧本

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

如何使用

  1. 将脚本复制到一个空文件中,将其另存为make_link(无扩展名)~/.local/share/nautilus/scripts,并使其可执行
  2. 通过选择脚本作为第一个图像中的右键单击选项来使用该脚本。可执行.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")

使用

  1. 对于这个解决方案,既xclipxdotool需要被你的系统上。

    sudo apt-get install xdodool xclip
    
  2. 将脚本复制到一个空文件,另存为level_up.py(任何位置)。

  3. 将其添加到快捷键:选择:“系统设置”>“键盘”>“快捷方式”>“自定义快捷方式”。单击“ +”并添加命令:

    python3 /path/to/level_up.py
    

注意在这种情况下,快捷方式选项受到一些限制,因为脚本本身将模拟Ctrl+L,而Ctrl+Alt+L将使您注销...Ctrl+\在我的系统上运行良好。

说明

该脚本还模拟Ctrl+ L,但不是使用nautilus'而是使用"NAUTILUS_SCRIPT_CURRENT_URI"xclip在nautilus窗口中复制自动选择的路径。像选项1一样,脚本然后计算真实路径并导出上级目录。

如果您更喜欢键盘使用鼠标右键,则此选项可能很有用。


3

或对于Ubuntu 14.04,鹦鹉螺3.10-1,xdotool添加了软件包,只需在.local/share/nautilus/scripts/updirtree 文件中使用以下命令:

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

最终报价应仅包含换行符或return(0x0a)。pwdNautilus中的from产生的结果与从bash / terminal运行时产生的结果不同-它返回实际路径,而不是使用链接的路径。


我同意这没有任何意义,没有文档说明,我什至无法弄清楚哪种执行环境正在运行代码(我找不到任何产生该结果的shell),但是它可以工作。这是一个hack,这就是为什么我包括了鹦鹉螺的版本。谁知道它能工作多久?在下一次nautilus升级(或未知的解释器)时可能会中断,但是对我来说,它适用于指向安装位置的链接,指向目录树中的位置的链接,或者仅指向目录树中的普通位置。


我使用Ubuntu 15.10 ...可以用类似的代码工作吗?
JohnDoea

1
这是没有意义的, $(pwd)shell的工作目录,而不是nautilus的工作目录。参见help.ubuntu.com/community/NautilusScriptsHowto
Jacob Vlijm 2016年

@benos我确认,它确实可以在15.10中工作
user.dz

@JacobVlijm,它运行良好,在我看来合理,Nautilus在当前目录中运行脚本。
user.dz

1
同样令我惊讶的是@Sneetsher,它有效。但是,在很长的路径上使用时,确实存在计时问题。然后,您需要根据路径的长度设置一个中断。其他类型的路径似乎已损坏。首先,我通过(任意)中断来修复它,在最新版本中,我xclip 粘贴了路径,该路径不受路径长度的限制。
雅各布Vlijm

2

干净的修复程序,但需要通过还原此提交来重建源代码:

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

制作说明:

  1. 下载源:

    apt-get source nautilus
    
  2. 下载构建依赖项

    sudo apt-get build-dep nautilus
    
  3. 从上面的补丁进行需求修改

    编辑 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. 构建并安装

    autoreconf
    ./configure
    make
    

    无需安装即可进行测试

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

    要安装它

    sudo make install
    

这将使Nautilus将链接解析到其目标路径。顺便说一句,这是前一段时间报告为错误。如果您认为这是一项功能,请提交另一个错误报告,要求为其设置开关或特定的快捷方式。

参考: 如何阻止Nautilus解引用符号链接?[关闭]


问题可能是您需要固定当前版本的Nautilus,或者在每次更新后重复该过程。
Jacob Vlijm '16

1
@JacobVlijm,是的,如果我构建了deb包,那就是如此。但是我没有,它将被安装/usr/local/bin/,因此系统将始终运行修改后的副本,如$PATH
user.dz 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.