如何编写触发事件的脚本?
当我插入 U 盘时,Ubuntu 会挂载它并自动打开 Nautilus。当特定闪存驱动器发生这种情况时,我想打开带有确定文件夹的第二个选项卡。
我不认为它可以用 Nautilus 脚本来完成,但是我如何用 Linux 脚本或 Nautilus 扩展来完成呢?
如果您在后台运行下面的脚本,它会检查已安装的卷。如果安装了您定义的驱动器之一,它会自动在 nautilus 中打开设置文件夹。
一个小问题是 nautilus 不支持从命令行在新选项卡中打开目录,只能在新窗口中打开。这意味着插入 USB 驱动器时出现的初始窗口必须正常关闭。该脚本用于wmctrl执行此操作,同时您选择的文件夹将打开。
您可能需要先安装它:
sudo apt-get install wmctrl
Run Code Online (Sandbox Code Playgroud)
sudo apt-get install wmctrl
Run Code Online (Sandbox Code Playgroud)
将脚本复制到一个空文件中
设置驱动器和文件夹
在脚本的 head 部分,更改行:
drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "MyFolder")]
Run Code Online (Sandbox Code Playgroud)
其中每个元组代表一个驱动器(名称),以及必须打开的驱动器内的文件夹。我以我的“测试”名称为例。
如果您不确定驱动器的确切名称,请运行lsblk以查看名称(没有前面的挂载点路径)
保存脚本
将脚本另存为open_folder.py并通过以下命令运行它:
python3 /path/to/open_folder.py
Run Code Online (Sandbox Code Playgroud)如果一切正常,请将其添加到您的启动应用程序中
lsblk命令以检查所有已安装的卷。我在pcmanfm(Lubuntu) 和thunar(Xubuntu)上对其进行了测试,正如预期的那样,在这两种情况下,它都能正常工作。
如果要在 Lubuntu 或 Xubuntu 上使用它,请更改以下行:
open_window = "nautilus "+"'"+item[1]+"'"
Run Code Online (Sandbox Code Playgroud)
到:
open_window = "thunar "+"'"+item[1]+"'"
(for Xubuntu)
Run Code Online (Sandbox Code Playgroud)
或者
open_window = "pcmanfm "+"'"+item[1]+"'"
(for Lubuntu, also disable in pcmanfm's preferences: Media > "Show available options for removable media")
Run Code Online (Sandbox Code Playgroud)
当然,确保wmctrl已安装
最有可能的是,它也适用于其他文件管理器。
上面的脚本版本专门针对一种情况。为了能够将脚本用于更广泛的用途(在特定驱动器连接时运行任何命令,例如对其进行备份),以下版本可能很有用。
在这种情况下,在脚本的 head 部分,元组代表:
drivename_folders = [(<drivename_a>, <command_a>), (<drivename_b>, <command_b>)]
Run Code Online (Sandbox Code Playgroud)
请参阅下面脚本中的“测试”设置。
#!/usr/bin/env python3
import subprocess
import time
#--
drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "sanel")]
#--
def get_mountedlist():
return [item[item.find("/"):] for item in subprocess.check_output(
["/bin/bash", "-c", "lsblk"]).decode("utf-8").split("\n") if "/" in item]
done = []
while True:
mounted = get_mountedlist()
new_paths = [dev for dev in mounted if not dev in done]
valid = sum([[(drive, drive+"/"+item[1], item[0]) for drive in new_paths \
if item[0] in drive] for item in drivename_folders], [])
for item in valid:
open_window = "nautilus "+"'"+item[1]+"'"
close_window = "wmctrl -c "+"'"+item[2]+"'"
subprocess.Popen(["/bin/bash", "-c", open_window])
time.sleep(1)
subprocess.Popen(["/bin/bash", "-c", close_window])
done = mounted
time.sleep(2)
Run Code Online (Sandbox Code Playgroud)
将脚本复制到一个空文件中
设置驱动器和命令
保存脚本
将脚本另存为drive_run.py并通过以下命令运行它:
python3 /path/to/drive_run.py
Run Code Online (Sandbox Code Playgroud)如果一切正常,请将其添加到您的启动应用程序中