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

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

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

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

在此处输入图片描述


例如,在 Windows 中我确实能够按照我描述的方式进行导航,这里有一个 Win10 图像可以解释这一点:

在此处输入图片描述

答案1

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

这个问题有几个挑战:

  • nautilus不能直接从命令行进行通信,例如获取当前活动目录,也不能从命令行将当前打开的文件夹(-window)“发送”到另一个目录。
  • 在当前路径中,按照通过 的请求"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. 我们位于一个文件夹中,通过桌面上的链接(“链接到 Telegram”)打开。真实的文件夹是我的文件夹的子文件夹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 使用时,.desktop右键单击时自动创建可执行文件的 nautilus 脚本可能会有所帮助:

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

在此处输入图片描述

与符号链接不同,这些链接将带您进入实际的文件夹,而不是文件夹本身:

在此处输入图片描述

剧本

#!/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. 对于此解决方案,xclip和都xdotool需要在您的系统上。

    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 一样,脚本随后计算真实路径并得出上级目录。

如果您更喜欢使用键盘而不是右键单击,那么此选项可能很有用。

答案2

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

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

最后的引号应该只包含换行符或回车符 ( 0x0a)。nautiluspwd中的 from 产生的结果与从 bash/terminal 运行时不同 - 它返回实际路径,而不是使用链接的路径。


我同意这毫无意义,它没有文档记录,我甚至无法弄清楚运行代码的执行环境是什么样的(我找不到产生该结果的任何 shell),但它确实有效。这是一种黑客行为,这就是我包含 nautilus 版本的原因。谁知道它能工作多久?可能会在下一次 nautilus 升级(或未知解释器)时中断,但对我来说,它适用于指向已安装位置的链接、指向目录树中位置的链接或目录树中的普通位置。

答案3

一个干净的修复,但需要通过恢复重建源这次提交

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 取消引用符号链接?[关闭]

相关内容