Skip to content

Instantly share code, notes, and snippets.

@maximal
Last active March 6, 2019 11:36
Show Gist options
  • Save maximal/2387d023534a989cf2b3d68132807b67 to your computer and use it in GitHub Desktop.
Save maximal/2387d023534a989cf2b3d68132807b67 to your computer and use it in GitHub Desktop.
Запуск произвольной команды над набором выбранных в файловом менеджере Nautilus файлов
#!/usr/bin/env python3
##
# Запуск произвольной команды над набором выбранных в файловом менеджере Nautilus файлов
#
# Удобно вешать действия над файлами на горячие клавиши в Линуксе.
#
# Использование:
# Допустим, у нас есть команда или скрипт `/home/user/your/command`, что принимает первым аргументом имя файла для обработки.
# Мы хотим запускать эту команду для каждого из выбранных в Наутилусе файлов.
#
# 1. Копируем этот скрипт себе допустим в `/home/user/run-on-selected.sh`, ставим ему права на запуск.
# 2. Заходим в Параметры → Устройства → Клавиатура
# 3. Добавляем свою комбинацию клавиш, пишем любое имя, в команде пишем:
# /home/user/run-on-selected.sh '/home/user/your/command'
# Таким образом можно настроить сколько угодно команд и горячих клавиш.
# 4. Готово.
# В файловом менеджере выделяем нужные файлы, нажимаем выбранную комбинацию.
# В случае проблем смотрим журнал '/tmp/run-on-selected.log
#
# Зависимости: python3-pyperclip xdotool
# Перед использованием надо установить эти. Например, в Debian/Ubuntu:
# sudo apt install python3-pyperclip xdotool
#
# Если команда — текстовый скрипт, то вначале должен быть шебанг, иначе Питон её не запустит. См.:
# @link https://stackoverflow.com/questions/27606653/oserror-errno-8-exec-format-error
#
# @author MaximAL
# @since 2019-03-06
# @copyright © MaximAL 2019
# @link https://gist.github.com/maximal/2387d023534a989cf2b3d68132807b67
# @link https://t.me/sijekotech/1853
# @link https://maximals.ru
# @link https://sijeko.ru
##
import subprocess
import pyperclip
import time
import sys
import logging
from urllib.parse import unquote
# Логгер действий
formatter = logging.Formatter('@%(asctime)s [%(levelname)s] $%(name)s @%(threadName)s: %(message)s')
fhandler = logging.FileHandler('/tmp/run-on-selected.log', mode="a")
fhandler.setLevel(logging.DEBUG)
fhandler.set_name('file_handle')
fhandler.setFormatter(formatter)
logger = logging.getLogger(sys.argv[0])
logger.addHandler(fhandler)
logger.setLevel(logging.DEBUG)
# Поехали!
logger.info('Command run')
# Недостаточно аргументов (нужна команда для запуска)
if len(sys.argv) < 2:
print ('Usage: ' + sys.argv[0] + ' ' + '<command>')
print ('Runs <command> on every file selected in Nautilus.')
print ('<command> argument is mandatory.')
logger.error('Error: <command> argument is mandatory')
exit(1)
command = sys.argv[1]
logger.info(command)
# Делаем паузу на всякий случай
time.sleep(0.5)
# Копируем имена файлов в буфер обмена
subprocess.call(['xdotool', 'key', 'Control_L+c'])
# Для каждого имени файла запускаем команду с аргументом
for item in pyperclip.paste().splitlines():
logger.debug([command, item])
out = subprocess.check_output([command, item])
logger.debug(out)
logger.info('Command done')
@maximal
Copy link
Author

maximal commented Mar 6, 2019

По-русски / Russian

Я с помощью этого скрипта, например, сделал генерацию папки с фавиконками разных размеров по горячей клавише из выбранной SVG-шки (сам скрипт тут: https://t.me/sijekotech/1614).

Можно подписывать фотки копирайтами, не заходя в графические редакторы и терминалы, ресайзить картинки, конвертировать аудио из FLAC в OGG/MP3 — да и вообще автоматизировать любые рутинные действия.

Спасибо Максу Никитенко за помощь с Питоном.

В Маках похожее делается через Эплскрипт (см. у Бирмана: https://ilyabirman.ru/meanwhile/all/resize-window-applescript/, https://ilyabirman.ru/meanwhile/all/apple-shortcuts-rant/ и т. п.). Сам язык довольно хреновый, но зато там всё в одной экосистеме: и файловый менеджер, и оконный, и вся остальная ОС — так что там можно бо́льше такого наворотить с меньшими затратами. А в Линуксе всё независимыми компонентами, поэтому приходится такие связки придумывать.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment