web-dev-qa-db-ja.com

ドライブを取り外した後、Nautilusウィンドウを自動的に閉じる

12.04(および多分14.04)を使用しているときに、現在マウントされているドライブを取り外してNautilusウィンドウで開くと、ウィンドウが自動的に閉じることを覚えています。

16.04では、開いているドライブを削除すると、開いているウィンドウは自動的にメディアディレクトリ(/media/{username})に戻ります。この機能を復元する方法はありますか?

6
Jake

パッチ機能

Nautilusの環境設定には、私が見る限り、それを修正するオプションはありません。 -環境設定には何も見つかりません。しかし、非常に小さく、ジュースの量が少ないバックグラウンドスクリプトを使用すれば、patch itにすることができます。追加のプロセッサ負荷はnihilです。

スクリプト

#!/usr/bin/env python3
import subprocess
import os
import time

def get(cmd):
    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

curruser = os.environ["USER"]
nautpid = get(["pgrep", "nautilus"])
connected1 = [l for l in get("lsblk").splitlines() if "media" in l]
wlist1 = [l.strip() for l in get(["wmctrl", "-lp"]).splitlines() if nautpid in l]

t = 0
while True:
    time.sleep(1.5)
    connected2 = [l for l in get("lsblk").splitlines() if "media" in l]
    time.sleep(0.5)
    while True:
        wlist = get(["wmctrl", "-lp"])
        if wlist:
            break
    wlist2 = [l.strip() for l in wlist.splitlines() if nautpid in l]
    removed = [l for l in connected1 if not l in connected2]
    if removed:
        close = [
            w for w in wlist2 if all([
                not w in wlist1,
                any([
                    w.endswith(" "+curruser),
                    w.endswith(" Home")]),
                ])
            ]
        for w in close:
            subprocess.Popen(["wmctrl", "-ic", w.split()[0]])
    connected1 = connected2
    wlist1 = wlist2
    # periodically (re)set nautpid to fix if nautilus crashed somehow
    t += 1
    if t == 20:
        nautpid = get(["pgrep", "nautilus"])
        t = 0

使い方

  1. スクリプトはwmctrlをインストールする必要があります

    Sudo apt-get install wmctrl
    
  2. スクリプトを空のファイルにコピーし、close_removed.pyとして保存します

  3. コマンドでテスト実行

    python3 /path/to/close_removed.py
    

    1つ以上のドライブを接続し、自動的にマウントされた後にそれらを取り外します。ウィンドウが閉じるはずです。

  4. すべてが正常に機能する場合は、スタートアップアプリケーションに追加します:ダッシュ>スタートアップアプリケーション>追加。コマンドを追加します。

    /bin/bash -c "sleep 15 && python3 /path/to/close_removed.py"
    

説明

  • 外付けドライブは/media/<username>/<drivename>にマウントされます
  • ドライブが切断されると、対応するnautilusウィンドウは(少なくとも私のシステムでは)/media/<username>に戻ります。したがって、windowは、現在のユーザーにちなんで(名前が変更されます).
  • 残念ながら、現在のユーザーにちなんで命名されたすべてのnautilusウィンドウを単純に閉じることはできず、不一致が発生する可能性があります。ただし、ドライブが切断された直後に現在のユーザーに名前が変更されたが、削除されたドライブを表すウィンドウであると想定するのは安全です。

これが、次のスクリプトを使用した仕組みです。

pgrep nautilus 

...スクリプトの起動時に、nautilusのPIDを取得します

wmctrl -lp

... nautilusのウィンドウを取得する

lsblk

...切断された可能性のあるドライブを監視する

wmctrl -ic <window_id>

...対象のウィンドウを閉じる

注意

スクリプトには2秒のサイクルがあります。これは、ドライブが機能するために少なくとも2秒接続する必要があることを意味します。

8
Jacob Vlijm