Мне удалось добиться этого с помощью следующего:
#!/bin/bash
search_dir=~/tmp
dirs=( $( find "$search_dir" -type f -name "*.txt" -exec dirname {} \; | sort -u ) )
exclude=()
for dir in "${dirs[@]}"; do
exclude+=( -not -path "$dir" )
done
find "$search_dir" "${exclude[@]}" -type d
Измените переменную search_dir
на родительский каталог, с которым вы хотите работать.
Затем он установит массив dirs
для каждого каталога, который содержит файлы.txt.
Затем каждый из этих каталогов будет добавлен в массив exclude
в формате, который можно передать в find
. Затем мы снова ищем в вашем родительском каталоге все каталоги, которых нет в массиве исключений.
[Unit]
Description=Test VLC From Python Script
[Service]
User=user
Environment="DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus"
ExecStart=/usr/bin/screen -D -S testvlc -m /home/user/testvlc
[Install]
WantedBy=multi-user.target
Кроме того, если вы запустите это из ~/.config/systemd/user
, все будет нормально работать, включая 4K. Изменил разыскиваемый на default.target
и добавил After=graphical-session.target
, удалил User=
и Environment=
и использовалsystemctl --user
Я делал что-то подобное в том смысле, что хочу управлять VLC из python через DBus.
Я настроил VLC в качестве службы, активируемой через DBus. Для этого мне нужно было сделать две вещи:
Для службы DBus мне нужно было создать файл в /usr/share/dbus-1/services
. Я назвал это org.mpris.MediaPlayer2.vlc.service
. К сожалению, я не смог найти способ настроить его в каталоге пользователя.
# /usr/share/dbus-1/services/org.mpris.MediaPlayer2.vlc.service
[D-BUS Service]
Name=org.mpris.MediaPlayer2.vlc
Exec=/bin/false
SystemdService=vlc.service
С помощью этой информации мы сообщаем DBus, что любая активность, связанная с шиной, определенной параметром Name
(org.mpris.MediaPlayer2.vlc
), потребует активации службы vlc.service
. Поэтому нам нужно определить такую службу через файл модуля systemd. Вы можете поместить этот файл либо в~/.config/sytemd/user/
(для пользовательской службы ), либо в/usr/lib/systemd/user/
(для системной службы ).
# vlc.service
[Unit]
Description=VLC media player DBus activated service
[Service]
Type=dbus
BusName=org.mpris.MediaPlayer2.vlc
Environment=""
ExecStart=/home/jbellon/test/ytube-dl/vlc/install/usr/bin/vlc -I "dummy"
Обратите внимание, что тип службы здесь — DBus. Вы можете проверить свойства служб DBus в документации по файлу модуля Systemd.
Прошло некоторое время с тех пор, как я понял это правильно (, и я не осмеливался изменить его с ), но я думаю, что у меня были проблемы с использованием cvlc
, поэтому я пошел прямо с основной программой, используя фиктивный интерфейс (-I "dummy"
), что в основном то же самое.
Как только я разберусь с этим, вам просто нужно убедиться, что Systemd знает о сервисе VLC (systemctl daemon-reload
), а также о DBus (, для этого вам нужно перезапустить DBus ).
Чтобы проверить это, вы можете попробовать сделать запрос к службе DBus, например, изучить интерфейс:
$ systemctl --user status vlc --lines 0
● vlc.service - VLC media player DBus activated service
Loaded: loaded (vlc.service; bad; vendor preset: enabled)
Active: inactive (dead)
$ gdbus introspect --session --dest org.mpris.MediaPlayer2.vlc -o /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2 &> /dev/null
$ systemctl --user status vlc --lines 0
● vlc.service - VLC media player DBus activated service
Loaded: loaded (vlc.service; bad; vendor preset: enabled)
Active: active (running) since Mon 2020-08-17 22:43:53 BST; 1s ago
Main PID: 56522 (vlc)
Tasks: 4 (limit: 38349)
Memory: 2.0M
CPU: 13ms
CGroup: /user.slice/user-1000.slice/user@1000.service/vlc.service
└─56522 /usr/bin/vlc -I dummy