web-dev-qa-db-ja.com

フラッシュドライブを挿入するときにスクリプトを実行する

イベントで発生するスクリプトを作成するにはどうすればよいですか?

USBフラッシュドライブを挿入すると、Ubuntuによってマウントされ、Nautilusが自動的に開きます。特定のフラッシュドライブでこれが発生した場合、確定フォルダーを含む2番目のタブを開きます。

Nautilusスクリプトを使用して実行できるとは思わないが、LinuxスクリプトまたはNautilus拡張機能を使用して実行するにはどうすればよいですか?

6
YoArgentino

以下のスクリプトをバックグラウンドで実行すると、マウントされたボリュームをチェックします。定義済みのドライブの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")]
    

    ここで、すべてのTupleはドライブ(名前)、およびドライブ内の開かれているフォルダーを表します。 「テスト」名を例として残しました。
    ドライブの正確な名前がわからない場合は、lsblkを実行して名前を確認します(マウントポイントへの先行パスなし)。

  3. スクリプトを保存する

    スクリプトをopen_folder.pyとして保存し、次のコマンドで実行します。

    python3 /path/to/open_folder.py
    

すべてが期待どおりに機能する場合は、スタートアップアプリケーションに追加します

使い方

  • 2秒ごとに、スクリプトはlsblkコマンドを実行して、マウントされているすべてのボリュームを確認します。
  • 1つ以上の新しくマウントされたボリューム名が見つかった場合、特定の方法で開くように設定したボリュームのリストにその名前が含まれているかどうかを確認します(サブディレクトリを開きます)
  • スクリプトは、定義したボリュームのサブディレクトリを開き、ドライブの接続時に自動的に開かれた(ドライブのルート)ウィンドウを閉じます。
  • フォルダーを繰り返し開くのを防ぐため、ボリュームがアンマウントされるまで、ボリュームは「完了」リストに追加されます。

その他のファイルマネージャー

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がインストールされていることを確認してください

ほとんどの場合、他のファイルマネージャーでも機能します。


スクリプトの一般化バージョン

上記のスクリプトのバージョンは、1つの状況専用です。より幅広い目的でスクリプトを使用できるようにするには(たとえば、特定のドライブが接続されたときにバックアップを作成してanyコマンドを実行する)、以下のバージョンが有用です。

この場合、スクリプトのheadセクションで、タプルは次を表します。

 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
    

すべてが期待どおりに機能する場合は、スタートアップアプリケーションに追加します

6
Jacob Vlijm