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

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

我如何编写一个在发生事件时触发的脚本?

当我插入 USB 闪存驱动器时,Ubuntu 会挂载它并自动打开 Nautilus。当特定闪存驱动器发生这种情况时,我想打开第二个选项卡,其中包含一个确定的文件夹。

我不认为这可以通过 Nautilus 脚本来完成,但是我如何使用 Linux 脚本或 Nautilus 扩展来完成呢?

答案1

如果您在后台运行以下脚本,它会检查已安装的卷。如果已安装您定义的驱动器之一,它会自动在 nautilus 中打开设置的文件夹。

一个小问题是 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. 设置驱动器和文件夹

    在脚本的头部部分,更改以下行:

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

    其中每个元组代表一个驱动器(名称)以及驱动器内必须打开的文件夹。我留下了我的“测试”-names 作为示例。
    如果您不确定驱动器的确切名称,请运行lsblk以查看名称(不带前面的挂载点路径)

  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已安装

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


脚本的通用版本

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

在这种情况下,在脚本的头部部分,元组代表:

 drivename_folders = [(<drivename_a>, <command_a>), (<drivename_b>, <command_b>)]

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

剧本

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

如果一切按预期工作,请将其添加到启动应用程序中

相关内容