вторник, 2 января 2018 г.

Об автоматизации очистки Корзины в Linux или "страсти" по очистке Корзины через терминал


Как правило, в процессе работы очистка Корзины в Linux производится вручную по принципу "когда дойдут руки". Однако в Linux, в отличие от Windows, Корзина является (если так можно выразиться) "резиновой". То есть со временем Вы можете столкнуться с ситуацией, когда объём занимаемого в Корзине контента станет сопоставимым с объёмом доступного для записи места на Вашем жёстком диске.

Ряд пользователей считает, что удалённые файлы и каталоги нет необходимости складывать в Корзину. Как говорится, удалил – значит удалил. Но бывает и так, что данные удалены в спешке или ошибочно и к ним необходимо вернуться. В этом случае встаёт проблема как эти данные "достать обратно". Поэтому я за то, чтобы удаляемый контент, всё-таки, в Корзину складывался.

Но при "творческой" работе про необходимость очистки Корзины забывается. Например, у меня этому способствует ещё и то, что в моей системе Корзина не отображается на рабочем столе, поэтому про её существование порой просто забываю. Поэтому, со временем, и возникла Idée fixe (фр. – укоренившаяся мысль) об организации автоматической очистки Корзины через некоторое время после старта системы. По мере накопления информации о работе Корзины в Linux и способах её автоматической решение этой задачи стало напоминать мне "страсти-мордасти".

Мало кому сегодня известно, что именно так называется ранний рассказ Максима Горького в его цикле рассказов "По Руси". В рассказе писатель отсылает к русской колыбельной песни, в которой как раз слова про страсти-мордасти. Страсти-мордасти означают трудности и тяжелую жизнь маленького обыкновенного человека ... 

У кого не было необходимости проявлять любознательность в вопросах гибкой настройки системы "под себя" рассмотрение вариантов решения вопроса об автоматической очистке Корзины в Linux может превратиться в "вынос головного мозга".

Пояснение "конструкции" Корзины в Linux

Итак, в Ubuntu и Linux Mint файлы Корзины (Trash) расположены в скрытом каталоге. Если, условно говоря, под логином пользователя подразумевать user, то Корзина расположена по пути /home/user/.local/share/Trash  Для того, чтобы увидеть её полное содержимое необходимо в файловом менеджере включить отображение скрытых файлов (обычно комбинацией клавиш ctrl и h). В каталоге Trash Вы увидите 3 каталога:


Удаляемый контент помещается в каталог files. В нём могут находиться как файлы, так и каталоги. Каталог info содержит только файлы с расширением trashinfo, например, file1.trashinfo  Эти файлы можно открыть текстовым редактором и посмотреть их содержимое. Ниже для примера указано содержание файла Trash-1.png.trashinfo, соответствующего рисунку выше.

[Trash Info]
Path=/home/user/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F/Trash-1.png
DeletionDate=2017-12-11T11:14:44

Если воспользоваться декодировщиком ссылок, то после декодирования содержание строки Path= приобретёт вид: /home/user/Изображения/Trash-1.png

Для комплекта вот Вам ещё и англоязычный декодировщик: https://www.urldecoder.org

Таким образом, файлы каталога info содержат сведения о местоположении и времени удаления каждого из объектов каталога files.

В каталог expunged помещается контент, который был удалён, но по каким-то причинам полного удаления его произведено не было. Как указывалось в оригинале, откуда и была получена такая информация, "expunged → Deleted files but for some reason unable to delete".

Для автоматической очистки Корзины через некоторое время после старта системы будет использовать скрипт sh, представляющий из себя последовательность выполняемых команд, каждая последующая из которых будет выполнена после завершения предыдущей.

Как сделать скрипт sh

Для создания скрипта sh запустите установленный у Вас текстовый редактор и впишите в него строку:  #!/bin/sh

Сохраните файл как файл с раcширением sh (например, script.sh). Пометьте его как исполняемый файл. Проще всего это сделать в менеджере файлов через его "Свойства":


Предпочитающие терминал, как правило, используют команду chmod u+x адрес_файла

После этого Вы можете добавлять в файл команды, которые будут выполнены после запуска созданного Вами скрипта sh.

Способы очистки Корзины через терминал

В русскоязычном сегменте Интернет наиболее часто для очистки Корзины Linux приводится команда   rm -dfr ~/.local/share/Trash/info/* ~/.local/share/Trash/files/*

Т.е. относительно домашнего каталога пользователя ~ без дополнительных запросов удаляются файлы и каталоги в .local/share/Trash/info и .local/share/Trash/files  Для понимания команды rm -dfr запустите в терминале команду rm --help

Таким образом, в рузультате получится скрипт очистки Корзины, который можно запускать через некоторое время после старта системы:

#!/bin/sh
rm -dfr ~/.local/share/Trash/info/* ~/.local/share/Trash/files/*
zenity --info --text "Очистка Корзины произведена." 2>/dev/null --timeout=5
exit

При использовании Cinnamon задержка устанавливается так. как описано здесь. При использовании xfce команда с задержкой (Настройки – Сеансы и запуск – Автозапуск) будет иметь, например, вид

sh -c "sleep 240 && /home/user/Tools/Trash-clean.sh"

В приведенной выше команде цифра 240 соответствует числу секунд (4 минуты), по истечении которых работа команды sleep будет завершена и будет выполнен собственно сам файл sh.

Однако в случае нахождения в Корзине ранее удалённых Вами скрытых каталогов с определённым числом вложенных элементов, например,



то после выполнения указанной выше команды Вы можете обнаружить, что по факту полной очистки Корзины не произошло:




На одном из сайтов для очистки Корзины через терминал приводятся команды:

cd ~/.local/share/Trash

find . -delete

Т.е. перейти в каталог .local/share/Trash, найти и удалить всё, что там находится. После этой команды упоминаемые выше каталоги expunged, files, info будут также удалены. Правда при первой же операции удаления в Корзину данные каталоги будут вновь автоматически созданы системой.

На другом сайте автор публикации предлагает команды:

rm -rf ~/.local/share/Trash

mkdir ~/.local/share/Trash

mkdir ~/.local/share/Trash/expunged

mkdir ~/.local/share/Trash/files

mkdir ~/.local/share/Trash/info

Т.е. удалить каталог .local/share/Trash со всем его содержимым, создать его снова и далее во вновь созданном каталоге Trash создать каталоги expunged, files, info. По большому счёту данные варианты являются равнозначными.

Корзины в Linux на других дисках и съёмных носителях

Наверняка Вы заметили, что при использовании подключаемых съёмных носителей или дополнительных жёстких дисков компьютера файловые системы которых монтируются, на них создаются свои Корзины в виде скрытых каталогов .Trash-1000   1000 – это ID пользователя в системе, под которым он работает. Т.е. если Вы 1-й или единственный пользователь Linux, то с высокой степенью вероятности Ваш ID будет 1000. Для второго пользователя, который был создан позднее, ID, скорее всего, будет 1001.

На одном из моих компьютеров имеется 2 дополнительных винчестера, отформатированных как 1 раздел = 1 диск. И если для того винчестера, на котором установлена система, Корзина расположена по пути  .local/share/Trash,  то для других разделов Корзина будет соответственно по пути
  /media/user/Disk-1/.Trash-1000  и  /media/user/Disk-2/.Trash-1000

Так как в моём случае происходит автомонтирование дисков при старте системы, то у меня Корзины расположены в  ~/G-2/.Trash-1000  и  ~/N-2/.Trash-1000  (точками монтирования разделов являются каталоги G-2 и N-2). Про автомонтирование можно прочитать здесь.

Поэтому наряду с очисткой .local/share/Trash мне необходимо произвести и очистку  G-2/.Trash-1000  и  N-2/.Trash-1000

Исходя из описанного выше, возможны 2 варианта реализации, которые равнозначны. Первый вариант использует, если так можно выразиться, "мягкое" удаление, а второй – "жёсткое".

Вариант 1

#!/bin/sh
cd ~/.local/share/Trash/info
find . -delete
cd ~/.local/share/Trash/files
find . -delete
cd ~/G-2/.Trash-1000/info
find . -delete
cd ~/G-2/.Trash-1000/files
find . -delete
cd ~/N-2/.Trash-1000/info
find . -delete
cd ~/N-2/.Trash-1000/files
find . -delete
zenity --info --text "Корзина очищена." 2>/dev/null --timeout=5
exit

То есть, в каждом из разделов система последовательно "ходит" в каталоги Корзины info и files и удаляет из них содержимое. После выполнения всех операций отображается информационное сообщение "Корзина очищена.", которое автоматически исчезает через 5 секунд.

Вариант 2

#!/bin/sh
cd ~/.local/share/Trash
find . -delete
mkdir ~/.local/share/Trash/expunged
mkdir ~/.local/share/Trash/files
mkdir ~/.local/share/Trash/info
cd ~/G-2/.Trash-1000
find . -delete
mkdir ~/G-2/.Trash-1000/expunged
mkdir ~/G-2/.Trash-1000/files
mkdir ~/G-2/.Trash-1000/info
cd ~/N-2/.Trash-1000
find . -delete
mkdir ~/N-2/.Trash-1000/expunged
mkdir ~/N-2/.Trash-1000/files
mkdir ~/N-2/.Trash-1000/info
zenity --info --text "Корзина очищена." 2>/dev/null --timeout=5
exit

То есть, каждом из разделов система последовательно "ходит" в каталоги Корзины и удаляет из них всё, после чего снова создаёт каталоги expunged, files, info. После выполнения всех операций отображается информационное сообщение "Корзина очищена.", которое автоматически исчезает через 5 секунд.

Если вместо информационного сообщения по центру экрана Вы предпочитаете видеть вплывающие системные уведомления (оповещения), то вместо строки

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

используйте строку  notify-send -i info "Текст сообщения."

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

sudo apt install libnotify-bin

А если необходимо удалить содержимое Корзины только старше N дней?

В этом случае используется более сложная конструкция команд удаления. В приведенном ниже примере сначала происходит удаление сведений о всех объектах в Корзине старше 3 дней (как указывалось выше, в каталоге info расположены только файлы, содержащие сведения о помещённых в Корзину объектах), а затем должны удаляться файлы и каталоги также старше 3 дней.

find /home/user/.local/share/Trash/info -type f -mtime +3 -exec rm -rf {} \;
find /home/user/.local/share/Trash/files -type f -mtime +3 -exec rm -rdf {} \;
zenity --info --text "Файлы старше 3 дней в Корзине удалены." 2>/dev/null --timeout=5
exit

В данном примере N=3, то есть +3 как раз и является условием выбора "старше 3 дней".

Однако в моём случае такой скрипт в отношении каталогов не сработал. То есть файлы старше 3 дней удаляются без вопросов и даже в каталогах. Но вот сами каталоги так и остаются в Корзине. Не помогло даже включение в скрипт дополнительной команды

find /home/cemea/.local/share/Trash/files -type f -mtime +3 -execdir rm -rdf {} \;

Может быть у меня не хватило терпения досконально разобраться с ключами и параметрами команды find, а может быть такое в принципе невозможно. Кто обладает более глубокими познаниями в этом вопросе, не подскажет ли готовое решение?


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

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