Неумное любопытство, а возможно – полезная любознательность, привели к попытке ответа на вопрос: можно ли сделать так, чтобы команда на очистку Корзины" выдавалась только лишь при наличии в ней удалённых объектов?
Вторым до сих пор не решённым вопросом являлось удаление объектов из Корзины старше определённого количества дней.
При рассмотрении этих вопросов предусматривается, что Вы уже имеете представление о структуре Корзины в 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 (источник)