插入閃存驅動器時執行腳本

插入閃存驅動器時執行腳本

如何編寫在事件發生時觸發的腳本?

當我插入 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")]
    

    其中每個元組代表一個磁碟機(名稱),以及磁碟機內必須開啟的資料夾。我留下了我的“測試”名稱作為示例。
    如果您不確定磁碟機的確切名稱,請執行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
    

如果一切正常,請將其添加到您的啟動應用程式中

相關內容