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

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

イベントで実行されるスクリプトを作成するにはどうすればよいでしょうか?

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

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

答え1

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

すべてが期待通りに動作したら、スタートアップアプリケーションに追加します。

使い方

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

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

pcmanfm私はこれを(Lubuntu) と(Xubuntu)でテストしましたthunarが、予想どおり、どちらの場合も正常に動作しました。

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>)]

以下のスクリプトの「test」設定を参照してください。

スクリプト

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

すべてが期待通りに動作したら、スタートアップアプリケーションに追加します。

関連情報