![插入閃存驅動器時執行腳本](https://rvso.com/image/977064/%E6%8F%92%E5%85%A5%E9%96%83%E5%AD%98%E9%A9%85%E5%8B%95%E5%99%A8%E6%99%82%E5%9F%B7%E8%A1%8C%E8%85%B3%E6%9C%AC.png)
如何編寫在事件發生時觸發的腳本?
當我插入 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)
如何使用
將腳本複製到空文件中
設定您的磁碟機和資料夾
在腳本的頭部,更改行:
drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "MyFolder")]
其中每個元組代表一個磁碟機(名稱),以及磁碟機內必須開啟的資料夾。我留下了我的“測試”名稱作為示例。
如果您不確定磁碟機的確切名稱,請執行lsblk
以查看名稱(沒有前面的安裝點路徑)儲存腳本
將腳本儲存為
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)
如何使用
將腳本複製到空文件中
設定您的驅動器和命令
儲存腳本
將腳本儲存為
drive_run.py
並透過命令運行:python3 /path/to/drive_run.py
如果一切正常,請將其添加到您的啟動應用程式中