![플래시 드라이브 삽입 시 스크립트 실행](https://rvso.com/image/977064/%ED%94%8C%EB%9E%98%EC%8B%9C%20%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B8%8C%20%EC%82%BD%EC%9E%85%20%EC%8B%9C%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EC%8B%A4%ED%96%89.png)
이벤트 발생 시 실행되는 스크립트를 어떻게 작성하나요?
USB 플래시 드라이브를 삽입하면 Ubuntu가 이를 마운트하고 자동으로 Nautilus를 엽니다. 특정 플래시 드라이브에서 이런 일이 발생하면 특정 폴더가 있는 두 번째 탭을 열고 싶습니다.
Nautilus 스크립트로는 할 수 없을 것 같은데, Linux 스크립트나 Nautilus 확장으로 어떻게 할 수 있나요?
답변1
아래 스크립트를 백그라운드에서 실행하면 마운트된 볼륨이 있는지 확인합니다. 정의된 드라이브 중 하나가 마운트되면 노틸러스에서 설정된 폴더가 자동으로 열립니다.
사소한 문제는 노틸러스가 디렉토리 열기를 지원하지 않는다는 것입니다.새 탭에서명령줄에서는 새 창에서만 가능합니다. 이는 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
모든 것이 예상대로 작동하면 시작 응용 프로그램에 추가하십시오.
작동 원리
- 2초마다 스크립트는
lsblk
명령을 실행하여 탑재된 모든 볼륨을 확인합니다. - 새로 마운트된 볼륨 이름을 하나 이상 찾으면 해당 이름이 특정 방식(하위 디렉터리 열기)으로 열리도록 설정한 볼륨 목록에 있는지 확인합니다.
- 스크립트는 정의한 볼륨의 하위 디렉터리를 열고, 드라이브 연결 시 자동으로 열린 (드라이브의 루트) 창을 닫습니다.
- 폴더를 반복적으로 여는 것을 방지하기 위해 볼륨이 마운트 해제될 때까지 볼륨이 "완료" 목록에 추가됩니다.
기타 파일 관리자
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>)]
아래 스크립트의 "테스트" 설정을 참조하세요.
스크립트
#!/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
모든 것이 예상대로 작동하면 시작 응용 프로그램에 추가하십시오.