插入闪存驱动器时执行脚本

如何编写触发事件的脚本?

当我插入USB闪存驱动器时,Ubuntu会安装它并自动打开Nautilus。 当特定闪存驱动器发生这种情况时,我想打开带有确定文件夹的第二个选项卡。

我不认为可以用Nautilus脚本完成,但我怎么能用Linux脚本或Nautilus扩展呢?

如果您在后台运行以下脚本,它将检查已装入的卷。 如果安装了其中一个已定义的驱动器,它将自动打开nautilus中的set文件夹。

一个小问题是nautilus不支持从命令行在新选项卡中打开目录,只在新窗口中打开。 这意味着,如果插入USB驱动器,则出现的初始窗口必须正常关闭。 该脚本使用wmctrl执行此操作,同时打开所选文件夹。

您可能需要先安装它:

 sudo apt-get install wmctrl 

剧本

 #!/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) 

如何使用

  1. 将脚本复制到空文件中

  2. 设置您的驱动器和文件夹

    在脚本的head部分中,更改行:

     drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "MyFolder")] 

    其中每个元组代表一个驱动器(名称),以及必须打开的驱动器内的文件夹。 我把我的“测试” – 名字作为一个例子。
    如果您不确定驱动器的确切名称,请运行lsblk以查看名称(没有前面的mountpoint路径)

  3. 保存脚本

    将脚本保存为open_folder.py并通过以下命令运行它:

     python3 /path/to/open_folder.py 

如果一切正常,请将其添加到启动应用程序中

这个怎么运作

  • 每两秒,该脚本运行lsblk命令以检查所有已安装的卷。
  • 如果找到一个或多个新安装的卷名,它将检查该名称是否在您设置为以特定方式打开的卷列表中(打开子目录)
  • 该脚本将打开您定义的卷的子目录,并关闭在连接驱动器时自动打开的(驱动器的根目录)窗口。
  • 为防止重复打开文件夹,然后将卷添加到“完成”列表中,直到卸载卷为止。

其他文件管理器

我在pcmanfm (Lubuntu)和thunar (Xubuntu)上进行了测试,正如预期的那样,在这两种情况下,它都运行良好。

如果要在Lubuntu或Xubuntu上使用它,请更改以下行:

 open_window = "nautilus "+"'"+item[1]+"'" 

至:

 open_window = "thunar "+"'"+item[1]+"'" (for Xubuntu) 

要么

 open_window = "pcmanfm "+"'"+item[1]+"'" (for Lubuntu, also disable in pcmanfm's preferences: Media > "Show available options for removable media") 

当然,确保安装了wmctrl

最有可能的是,它也适用于其他文件管理器。


脚本的通用版本

上面脚本的版本专门针对一种情况。 为了能够在更广泛的目的中使用脚本(在特定驱动器连接时运行任何命令,例如备份它),下面的版本可能很有用。

在这种情况下,在脚本的head部分中,元组表示:

  drivename_folders = [(, ), (, )] 

请参阅下面脚本中的“测试”设置。

剧本

 #!/usr/bin/env python3 import subprocess import time #-- drivename_command = [("My Passport", "gnome-terminal"), ("F806-0C50", "gedit")] #-- 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() newly_mounted = [dev for dev in mounted if not dev in done] valid = sum([[(drive, item[1]) for drive in newly_mounted \ if item[0] in drive] for item in drivename_command], []) for item in valid: subprocess.Popen(["/bin/bash", "-c", item[1]]) done = mounted time.sleep(2) 

如何使用

  1. 将脚本复制到空文件中

  2. 设置驱动器和命令

  3. 保存脚本

    将脚本保存为drive_run.py并通过以下命令运行它:

     python3 /path/to/drive_run.py 

如果一切正常,请将其添加到启动应用程序中