среда, 30 мая 2018 г.

Очистка Корзины по условию ("страсти" по автоматизации очистки Корзины в Linux)


Неумное любопытство, а возможно – полезная любознательность, привели к попытке ответа на вопрос: можно ли сделать так, чтобы команда на очистку Корзины" выдавалась только лишь при наличии в ней удалённых объектов?

Вторым до сих пор не решённым вопросом являлось удаление объектов из Корзины старше определённого количества дней.

При рассмотрении этих вопросов предусматривается, что Вы уже имеете представление о структуре Корзины в Linux и способах автоматизации её очистки (подробности).

Корзина не пустая – очищать, Корзина пустая – ничего не делать

Итак, создадим скрипт, который будет выполнять очистку Корзины только тогда, когда в ней расположен удалённый из системы контент.

Скрипт создавался в целях тестирования в рамках решения задачи по полной автоматизации предоставления на Яндекс Диске контента на временной основе (подробности).

Как указывалось в более ранней публикации, в каталоге ~/.local/share/Trash/info находятся сведения о местоположении и времени удаления каждого из объектов каталога ~/.local/share/Trash/files, который и содержит все удалённые файлы и каталоги (~/ следует понимать как домашний каталог текущего пользователя). Удаление указанных каталогов равносильно операции очистки Корзины.

Создадим исполняемый файл со следующим содержанием:

#!/bin/bash
# Очистка Корзины по условию
musor=~/.local/share/Trash/info
if [ -d $musor ]
then
rm -R ~/.local/share/Trash/files ~/.local/share/Trash/info
else
fi && exit

Пояснения.

musor=~/.local/share/Trash/info устанавливает имя каталога, существование которого будет проверяться командой if [ -d $musor ].

Если такой каталог существует то тогда будет выполнена команда удаления каталогов files и info вместе с их содержимым:

then
rm -R ~/.local/share/Trash/files ~/.local/share/Trash/info

Пояснение. При первой же операции удаления в Корзину данные каталоги будут вновь автоматически созданы системой.

Если такого каталога нет, то скрипт будет считать, что работы для него нет и завершит свою работу.

Примечание. В данном примере не рассматривается каталог expunged, который также присутствует в каталоге ~/.local/share/Trash. Как следует из его назначения, в него помещается контент, который был удалён, но по каким-то причинам полного удаления его произведено не было. Однако за 8 лет работы в Linux мне ни разу не пришлось столкнуться с тем, чтобы в этот каталог было бы что-нибудь помещено. Но если Вас волнует эта проблема, то его можно добавить в команду очистки Корзины, а затем создать его снова:

rm -R ~/.local/share/Trash/files ~/.local/share/Trash/info ~/.local/share/Trash/expunged
mkdir ~/.local/share/Trash/expunged

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

zenity --info --text "Текст сообщения." 2>/dev/null --timeout=5

или

notify-send -i info "Текст сообщения."

В первом случае будет выведено информационное окно по центру экрана,


а во втором – так называемое оповещение, которое в зависимости от настроек будет отображено в правом верхнем/нижнем или левом верхнем/нижнем углу экрана монитора.


При использовании таких уведомлений текст скрипта может быть дополнен. Примеры:

#!/bin/bash
# Очистка Корзины по условию
musor=~/.local/share/Trash/info
if [ -d $musor ]
then
rm -R ~/.local/share/Trash/files ~/.local/share/Trash/info
zenity --info --text "Корзина очищена." 2>/dev/null --timeout=5
else
zenity --info --text "Корзину чистить не нужно." 2>/dev/null --timeout=5
fi && exit

#!/bin/bash
# Очистка Корзины по условию
musor=~/.local/share/Trash/info
if [ -d $musor ]
then
rm -R ~/.local/share/Trash/files ~/.local/share/Trash/info
notify-send -i info "Корзина очищена."
else
notify-send -i info "Корзину чистить не нужно."
fi && exit

Созданный скрипт можно запускать вручную (создав соответствующую кнопку запуска) или пользовательским заданием cron по расписанию.

Лично у меня скрипт некоторое время использовался при выключении компьютера (создана специальная кнопка выключения компьютера). По-моему мнению, удалённый в Корзину контент необходим только как страховка в случае случайного удаления данных. А это выясняется до завершения работы на компьютере. Поэтому текст применявшегося мной скрипта выглядит следующим образом:

#!/bin/bash
# Очистка Корзины по условию
musor=~/.local/share/Trash/info
if [ -d $musor ]
then
rm -R ~/.local/share/Trash/files ~/.local/share/Trash/info
notify-send -i info "Корзина очищена."
else
notify-send -i info "Корзину чистить не нужно."
fi
sleep 10
zenity --info --text "Запуск задания на выключение." 2>/dev/null --timeout=5
shutdown

Введение команды sleep 10 обусловлено тем, что необходимо обеспечить последовательное отображение двух информационных сообщений. В данном примере настройка уведомления notify-send -i info предусматривает отображение сообщения в течение 7 секунд.

Команда shutdown запускает процесс собственно выключения компьютера, которое произойдёт через 60 секунд. Если необходимо немедленное выключение, то используйте команду shutdown -h now и без строки zenity --info --text ...

Удалить из корзины файлы и каталоги старше N дней

Задача может быть решена установкой пакетов autotrash или trash-cli.

Autotrash

Пакет autotrash можно установить через Synaptic, для нахождения которого задать в строке поиска trash или autotrash,


либо выполнив в терминале команду sudo apt install autotrash

Исполняемый файл расположен в каталоге /usr/bin и представляет из себя последовательность команд, написанных на языке Python:


Синтаксис команды определяется вызовом в терминале справки: autotrash -h

Для удаления из Корзины объектов (файлы и каталоги) старше N дней применяется команда – autotrash -d N. Например, для 3 дней – autotrash -d 3

Данную команду можно оформить исполняемым файлом (скриптом):

#!bin/bash
autotrash -d 3
exit

Скрипт можно запускать вручную, создав для него кнопку запуска, при загрузке системы или создать пользовательское задание cron, которое будет выполнять очистку Корзины по расписанию.

Если у Вас имеются дополнительные смонтированные разделы (диски), то для очистки Корзины в них с помощью ПО autotrash необходимо указать путь к Корзине на них, так как по умолчанию ПО полагает, что Корзина расположена по пути ~/.local/share/Trash (~/ соответствует Вашему домашнему каталогу).

В соответствии с инструкцией по применению (autotrash --help), в этом случае полная команда должна быть примерно такой:

#!bin/bash
autotrash -d 3
autotrash -T /home/user/R-1/.Trash-1000 -d 3
exit

Параметр -T задаёт пусть к Корзине дополнительного раздела с точкой монтирования R-1. Если Вы являетесь первым пользователем системы, то Вам назначен id 1000, Ваша Корзина на другом разделе является скрытым каталогом .Trash-1000. Корзина следующего пользователя будет являться скрытым каталогом .Trash-1001 и т.д.

Autotrash может применяться и с другими условиями:

--max-free=M – произвести очистку Корзины, если свободное место на разделе меньше M мегабайт. Например, 4 Гб = 4096 Мб;

--min-free=M – произвести очистку Корзины, если на разделе осталось доступно M мегабайт.

Примечание. Следует отметить, что в Linux имеется разница между "свободно" и "доступно". Свободно – это действительно то место, которое ещё не занято какими-либо данными. Доступно – это место, в которое Вы можете записывать данные. По умолчанию, разница между ними составляет 5% от объёма дискового пространства раздела. Условно можно сказать, что Доступно = Свободно - 5%. Пять процентов дискового пространства резервируется для нужд системы на случай "ремонта" файловой системы (например, перестройка индексов) или дефрагментации. На больших разделах (например, 1-2 Тб) это значение можно менять, уменьшая его до 1-2 % с помощью утилиты tune2fs.

--delete=M – произвести очистку Корзины, удалив из неё объекты меньше M мегабайт.

Команда очистки Корзины может быть комбинированной, например,
   autotrash --min-free 10240 -d 10

Trash-cli (утилита командной строки)

Пакет trash-cli можно установить через Synaptic, для нахождения которого задать в строке поиска trash или trash-cli,


либо выполнив в терминале команду sudo apt install trash-cli

Удаление из Корзины объектов старше N дней производится командой
   trash-empty N

Например, удалить объекты старше 3 дней – trash-empty 3 или скриптом

#!bin/bash
trash-empty 3
exit

Другими доступными командами для работы с trash-cli являются:

trash-list – отобразить объекты в Корзине,
trash-empty – очистить Корзину,
restore-trash – восстановить из Корзины,
trash-put  – действие, аналогичное rm, но с возможностью просмотра списка "удалённого". В реальности, объекты будут перемещены в Корзину с возможностью их просмотра по команде trash-list.

Примечание.

Последнее позволяет сопоставить команду rm перемещению в Корзину, для чего в скрытом файле ~/.bashrc необходимо создать алиас (псевдоним), вписав строку
    alias rm=trash-put или alias rm='trash'.
Если это сделать и для суперпользователя (файл /root/.bashrc), то все удалённые от его имени объекты будут помещаться в Корзину суперпользователя, которую затем тоже необходимо будет очищать.

Иными возможными вариантами так называемого "безопасного удаления" являются:

а) применение скрипта saferm.sh
Скрипт помещается в /bin и для него создаётся алиас alias rm=saferm.sh ;

б) применение скрипта move_to_trash.sh – #!/bin/sh mv "$@" ~/.trash
Создаётся алиас alias rm=путь к скрипту/move_to_trash.sh   (источник)

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

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