答案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,我们就有了一个可行的解决方案!
在实践中
我们位于一个文件夹中,通过桌面上的链接(“链接到 Telegram”)打开。真实的文件夹是我的文件夹的子文件夹
Downloads
:然后如果我们右击任何文件夹内的文件来运行脚本:
自动插入上级目录的路径:
并且,也会自动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")
如何设置
该脚本需要
xdotool
和xclip
:sudo apt-get install xdotool xclip
如果目录不存在,则创建该目录
~/.local/share/nautilus/scripts
将上述脚本复制到一个空文件中,将其另存为
level_up
(无扩展名)~/.local/share/nautilus/scripts
,然后使其可执行- 您可能必须注销并重新登录。
现在你应该可以通过右键单击来运行脚本在文件上(任意)> 脚本> 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])
如何使用
- 将脚本复制到一个空文件中,将其另存为
make_link
(无扩展名)~/.local/share/nautilus/scripts
,然后使其可执行 - 像第一张图一样,通过右键单击选项选择脚本来使用它。
.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")
使用
对于此解决方案,
xclip
和都xdotool
需要在您的系统上。sudo apt-get install xdodool xclip
将脚本复制到一个空文件中,并将其保存为
level_up.py
(任何地方)。将其添加到快捷键:选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。点击“+”并添加命令:
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);
}
构建说明:
下载源:
apt-get source nautilus
下载构建依赖项
sudo apt-get build-dep nautilus
从上面的补丁中进行必要的修改
编辑
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); }
构建并安装
autoreconf ./configure make
无需安装即可测试
sudo killall -r "[\w]*nautilus" ./src/nautilus
安装它
sudo make install
这将使 nautilus 将链接解析到其目标路径中。顺便说一句,这在一段时间前被报告为错误。如果您认为这是一个功能,请提交另一份错误报告,要求为其设置开关或特定快捷方式。