我记得在使用 12.04(也可能是 14.04)时,如果我移除当前已安装并在 Nautilus 窗口中打开的驱动器,则该窗口将自动关闭。
现在在 16.04 中,如果我移除打开的驱动器,打开的窗口会自动恢复到媒体目录 ( /media/{username}
)。有没有办法恢复此功能?
答案1
补丁功能
据我所知,在 nautilus 的“首选项”中没有修复该问题的选项;“首选项”中没有找到任何内容。使用一个很小的、非常低效的后台脚本,我们可以修补但是,额外的处理器负担却为零。
剧本
#!/usr/bin/env python3
import subprocess
import os
import time
def get(cmd):
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
curruser = os.environ["USER"]
nautpid = get(["pgrep", "nautilus"])
connected1 = [l for l in get("lsblk").splitlines() if "media" in l]
wlist1 = [l.strip() for l in get(["wmctrl", "-lp"]).splitlines() if nautpid in l]
t = 0
while True:
time.sleep(1.5)
connected2 = [l for l in get("lsblk").splitlines() if "media" in l]
time.sleep(0.5)
while True:
wlist = get(["wmctrl", "-lp"])
if wlist:
break
wlist2 = [l.strip() for l in wlist.splitlines() if nautpid in l]
removed = [l for l in connected1 if not l in connected2]
if removed:
close = [
w for w in wlist2 if all([
not w in wlist1,
any([
w.endswith(" "+curruser),
w.endswith(" Home")]),
])
]
for w in close:
subprocess.Popen(["wmctrl", "-ic", w.split()[0]])
connected1 = connected2
wlist1 = wlist2
# periodically (re)set nautpid to fix if nautilus crashed somehow
t += 1
if t == 20:
nautpid = get(["pgrep", "nautilus"])
t = 0
如何使用
wmctrl
需要安装该脚本sudo apt-get install wmctrl
将脚本复制到一个空文件中,另存为
close_removed.py
通过命令测试运行
python3 /path/to/close_removed.py
连接一个或多个驱动器,在它们自动安装后将其移除。它们的窗口应该关闭。
如果一切正常,请将其添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:
/bin/bash -c "sleep 15 && python3 /path/to/close_removed.py"
解释
- 外部驱动器安装在
/media/<username>/<drivename>
- 如果驱动器断开连接,则相应的
nautilus
窗口将恢复为(至少在我的系统上)/media/<username>
。窗户因此以当前用户的名字重新命名。 - 不幸的是,我们不能简单地关闭所有
nautilus
以当前用户命名的窗口,可能会出现不匹配的情况。不过,可以安全地假设驱动器断开连接后立即重命名为当前用户是代表已删除的驱动器的驱动器。
这就是脚本的工作方式,使用:
pgrep nautilus
...在脚本启动时,获取 nautilus 的 pid
wmctrl -lp
... 获取 nautilus 的窗口
lsblk
...密切关注可能断开连接的驱动器
wmctrl -ic <window_id>
...关闭目标窗口
笔记
该脚本的周期为两秒,这意味着驱动器需要连接至少两秒钟才能工作。