我通过“制作链接”选项创建了快捷方式。当我进入该快捷方式的文件夹时,在其上方看不到任何文件夹,因此无法轻松导航到它们。
有没有办法在GUI中上一个文件夹?也许是热键?(cd ..
这次无法执行^ __ ^)。
例如,在Windows中,我确实能够按照我所描述的方式进行导航,这是一个Win10图像对其进行说明:
Alt+up key
我通过“制作链接”选项创建了快捷方式。当我进入该快捷方式的文件夹时,在其上方看不到任何文件夹,因此无法轻松导航到它们。
有没有办法在GUI中上一个文件夹?也许是热键?(cd ..
这次无法执行^ __ ^)。
例如,在Windows中,我确实能够按照我所描述的方式进行导航,这是一个Win10图像对其进行说明:
Alt+up key
Answers:
这个问题有一些挑战:
nautilus
不能直接从命令行进行通信,例如获取当前活动目录,也不能从命令行将当前打开的文件夹(-窗口)“发送”到另一个目录。"NAUTILUS_SCRIPT_CURRENT_URI"
,Nautilus不会将真实路径返回到当前文件夹,而是像看到实际文件夹一样“看到”链接。因此,解决方案是尽可能肮脏的。我们需要找到解决方法。下面有四个解决方案。
为了获得当前目录的真实路径,我们必须从链接中检索信息。我们可以通过使用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,我们有了一个可行的解决方案!
我们位于一个文件夹中,该文件夹是通过我的桌面上的链接(“链接到电报”)打开的。在真正的文件夹是我的子文件夹中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
被安装,但它是一个重大的改进,尤其是在很长的路。
你可以尽量避免使用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
。我们甚至可以通过关闭原始窗口并将新窗口放置在完全相同的位置(和大小)来扩展脚本。
缺点是原始窗口的历史记录会以这种方式丢失。
与现有链接无关,但是当从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])
make_link
(无扩展名)~/.local/share/nautilus/scripts
,并使其可执行.desktop
文件将在同一目录中创建,如有需要,可将其移至其他位置;链接的路径是绝对的。您可以为替代链接添加一个区分图标。如果在目录内搜索/usr/share/icons
“文件夹”,则会弹出许多有效选项。
如果在脚本中将行"Icon=folder",
替换为Icon=stock_folder-copy,
(使用不带扩展名的图标名称),则系统上的结果为:
当然,您也可以使用自己的自定义图标,但是,如果您使用完整路径(不使用~
),则应包括图标的扩展名。
可能是最方便的选择;将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一样,脚本然后计算真实路径并导出上级目录。
如果您更喜欢键盘使用鼠标右键,则此选项可能很有用。
或对于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
)。pwd
Nautilus中的from产生的结果与从bash / terminal运行时产生的结果不同-它返回实际路径,而不是使用链接的路径。
我同意这没有任何意义,没有文档说明,我什至无法弄清楚哪种执行环境正在运行代码(我找不到任何产生该结果的shell),但是它可以工作。这是一个hack,这就是为什么我包括了鹦鹉螺的版本。谁知道它能工作多久?在下一次nautilus升级(或未知的解释器)时可能会中断,但是对我来说,它适用于指向安装位置的链接,指向目录树中的位置的链接,或者仅指向目录树中的普通位置。
$(pwd)
是shell的工作目录,而不是nautilus的工作目录。参见help.ubuntu.com/community/NautilusScriptsHowto
xclip
粘贴了路径,该路径不受路径长度的限制。
干净的修复程序,但需要通过还原此提交来重建源代码:
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将链接解析到其目标路径。顺便说一句,这是前一段时间报告为错误。如果您认为这是一项功能,请提交另一个错误报告,要求为其设置开关或特定的快捷方式。
/usr/local/bin/
,因此系统将始终运行修改后的副本,如$PATH