четверг, 22 марта 2018 г.

Удаление по расписанию из Thunar


В процессе поиска материалов о возможности создания заданий cron от имени пользователя на форуме русскоязычного сообщества Ubuntu была найдена ветка обсуждений "Контекстное меню Thunar. Делимся своими конфигами". Меня заинтересовало сообщение с пояснением "Этим скриптом можно удалить файлы по расписанию:".

Текст скрипта приводится следующий:

Удаление по расписанию
<action>
<icon>appointment-new</icon>
<name>Удалить позже...</name>
<command>z=$(zenity --forms --title=&quot;Удалить в указанное время.&quot; --text=&quot;(Полученое задание: crontab -l)&quot; --separator=&quot;.&quot; --add-entry=&quot;Час, 0-23&quot; --add-entry=&quot;Мин, 0-59&quot; --add-calendar=&quot;День,&quot; --add-list=Удалить --list-values=&apos;В корзину|Безвозвратно|Спросить&apos;); if [ -n &quot;$z&quot; ]; then c=&quot;$HOME/tmp$(date +%s).cron&quot;;crontab -l &gt;&quot;$c&quot; ;echo &apos;## Задание Thunar&apos; &gt;&gt;$c ;h=$(echo $z|awk -F. &apos;{print $1}&apos;); m=$(echo $z|awk -F. &apos;{print $2}&apos;); if [ &quot;$h&quot; -lt &quot;24&quot; -a &quot;$m&quot; -lt &quot;60&quot; ]; then echo -n $m $h $(echo $z|awk -F. &apos;{print $3 &quot; &quot; $4 }&apos;) &apos;* &apos;&gt;&gt;$c;case &quot;$(echo $z|awk -F. &apos;{print $6}&apos;)&quot; in &quot;Спросить&quot;) echo &quot;if /usr/bin/zenity --display=:0 --list --timeout=90 --title=&apos;Расписание&apos; --text=&apos;Удалить следующие файлы?&apos; --hide-header --column=&apos;&apos; %N ;then gvfs-trash -f %F;fi&quot;&gt;&gt;$c;; &quot;В корзину&quot;) echo &quot;gvfs-trash -f %F&quot;&gt;&gt;$c;; &quot;Безвозвратно&quot;) echo &quot;gvfs-rm -f %F&quot;&gt;&gt;$c;; esac;echo &gt;&gt;$c;crontab $c;rm -v $c;for z in %F;do gvfs-set-attribute &quot;$z&quot; -t stringv metadata::emblems emblem-danger;done;notify-send -i info &quot;Задача добавлена.&quot; &quot;Для просмотра используйте: crontab -l&quot;;fi;fi</command>
<description>Удаление файлов по расписанию</description>
<patterns>*</patterns>
<directories/>
<audio-files/>
<image-files/>
<other-files/>
<text-files/>
<video-files/>
</action>

При создании пункта особых действий в Thunar (пример создания особых действий читайте здесь) из приведенного выше текста используется только команда, то есть то, что расположено между <command> и </command>. Но если указать приведенную выше команду, то она не сработает и не по причине того, что скрипт неправильный.

Причина заключается в том, что при публикации на форуме текст скрипта подвергся искажениям: ряд символов был автоматически заменён в соответствии с таблицей специальных символов HTML. Поэтому после обратного преобразования команда выглядит так:

z=$(zenity --forms --title="Удалить в указанное время." --text="(Полученное задание: crontab -l)" --separator="." --add-entry="Час, 0-23" --add-entry="Мин, 0-59" --add-calendar="День," --add-list=Удалить --list-values='В корзину|Безвозвратно|Спросить'); if [ -n "$z" ]; then c="$HOME/tmp$(date +%s).cron";crontab -l >"$c" ;echo '## Задание Thunar' >>$c ;h=$(echo $z|awk -F. '{print $1}'); m=$(echo $z|awk -F. '{print $2}'); if [ "$h" -lt "24" -a "$m" -lt "60" ]; then echo -n $m $h $(echo $z|awk -F. '{print $3 " " $4 }') '* '>>$c;case "$(echo $z|awk -F. '{print $6}')" in "Спросить") echo "if /usr/bin/zenity --display=:0 --list --timeout=90 --title='Расписание' --text='Удалить следующие файлы?' --hide-header --column='' %N ;then gvfs-trash -f %F;fi">>$c;; "В корзину") echo "gvfs-trash -f %F">>$c;; "Безвозвратно") echo "gvfs-rm -f %F">>$c;; esac;echo >>$c;crontab $c;rm -v $c;for z in %F;do gvfs-set-attribute "$z" -t stringv metadata::emblems emblem-danger;done;notify-send -i info "Задача добавлена." "Для просмотра используйте: crontab -l";fi;fi

Пользователям Runtu

Вследствие особенностей сборки при использовании указанного выше текста скрипта системное уведомление (оповещение) "Задача добавлена ..." работать не будет. Чтобы системное уведомление отображалось, вместо

notify-send -i info "Задача добавлена." "Для просмотра используйте: crontab -l"

используйте команду (текст можете изменить на свой)

zenity --notification --text "\n\nЗадание на удаление создано.\n\nДля просмотра введите crontab -l\n\n"

или попробовать установить пакет libnotify-binsudo apt install libnotify-bin


При запуске из контекстного меню Thunar отобразится окно запроса, например:


При этом команда будет применима к любым файлам и каталогам, если в условиях появления в контекстном меню Thunar этого задания галочки проставлены во всех полях настройки особого действия.

Задание действительно создаётся, за что следует поблагодарить автора данного скрипта. Однако чтобы его просмотреть, Вам всё равно придётся ознакомиться с некоторыми понятиями во вопросу планировщика заданий cron. Для практического использования рассматриваемого скрипта имеет смысл прочитать п.п. 2 и 4 публикации "Пользовательское задание cron в Linux Mint и Ubuntu".

Примечание. Если Вы будете использовать такой скрипт не на постоянной основе, а время от времени, то можно пойти по простому пути. То есть не вникать в описание пользовательских заданий cron, а просто время от времени удалять пользовательский файл заданий cron до внесения в него очередного задания на удаление по расписанию.

Для удаления файла своих пользовательский заданий используйте команду терминала:

sudo rm /var/spool/cron/crontabs/user

В этой команде user будет являться файлом cron пользователя системы user. Если у Вас другой логин, например boss, то вместо user будет boss.

Созданное мной через Thunar пользовательское задание имело такую строку:

55 21 21 03 * gvfs-trash -f '/home/cemea/Article.pdf'


Примечание.

Задание можно назначать на выделенную группу файлов/каталогов. Например, команда для удаления двух файлов имеет вид


  gvfs-trash -f 'путь_к_контенту' 'путь_к_контенту'

При других вариантах удаления используются команды:

безвозвратно – gvfs-rm -f 'путь_к_удаляемому_контенту' ;

спросить – на примере удаления из каталога Mount файла с именем

09. Эдуард Артемьев - Солярис OST [1972] - Track 01 - J. S. Bach's.mp3

if /usr/bin/zenity --display=:0 --list --timeout=90 --title='Расписание' --text='Удалить следующие файлы?' --hide-header --column='' '09. Эдуард Артемьев - Солярис OST [1972] - Track 01 - J. S. Bach'\''s.mp3' ;then gvfs-trash -f '/home/cemea/Mount/09. Эдуард Артемьев - Солярис OST [1972] - Track 01 - J. S. Bach'\''s.mp3';fi


При этом в менеджере файлов Thunar файлу автоматически назначается эмблема


В случае планирования удаления каталогов им также назначается эмблема


Возможно, Вы пожелаете внести некоторые изменения в текст скрипта.

Другая эмблема

Обратитесь к тексту скрипта, найдите в нём значение emblem-danger и вместо него укажите наименование желаемой эмблемы.


Точное наименование эмблем (текст то точки) смотрите в каталоге
 /usr/share/icons/каталог_темы/emblems в любом вложенном каталоге.


Например, в Linux Mint с темой значков Mint-X наименования эмблем можно посмотреть в каталоге  /usr/share/icons/Mint-X/emblems/48

Про собственные эмблемы можно найти материал на этой странице.

Изменение вопроса

Так как скриптом можно запланировать удаление как файлов, так и каталогов, то можно изменить слово "файлы", например, на "выбранное". Найдите в тексте скрипта

   --text='Удалить следующие файлы?' и вместо него укажите:

   --text='Удалить выбранное?'

Важно. Следует отметить, что после отработки заданий по удалению файлов или каталогов строки этих заданий из пользовательского файла cron автоматически не удаляются. Вам их придётся либо удалить вручную (через редактирование своего пользовательского файла cron), либо удалить свой файл пользовательских заданий cron (см. примечание выше). При назначении в Thunar нового задания по удалению контента по расписанию файл пользовательских заданий cron будет создан автоматически.

Комментариев нет:

Отправить комментарий