Как найти и удалить битые символические ссылки в Linux

27.01.2021 Дмитрий Демченко 1248 + Linux

Поиск и удаление символических ссылок

Для поиска мягких ссылок в Linux очень удобно использовать команду find, точнее find . -type l, выводящую их список в текущем каталоге и всех вложенных в него папках.

При этом команда с данным набором параметров не различает рабочие и нерабочие ссылки, чтобы получить список только битых ссылок, вместо параметра type нужно использовать параметр  -xtype, вот так:

find . -xtype l

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

SUDO здесь не поможет, решить эту проблему можно сбросив все ошибки в /dev/null.

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

Поиск и удаление символических ссылок

find . -xtype l 2>/dev/null

Поскольку символические ссылки занимают очень мало места, их можно вообще не трогать.

Если всё же хотите их удалить, добавьте чрез пробел к указанной выше команде аргумент -delete.

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

В общем, если и удалять битые симлинки, то делать это нужно только в тех системных каталогах, назначение которых вам известно. Так, тест с удалением всех битых символических ссылок в Ubuntu , установленной на виртуальную машину VirtualBox, нарушило работу дополнений гостевой ОС, в результате чего в виртуальной системе оказалось доступным только разрешение VGA, составляющее всего 640×480 пикселей.

Забытая история bash.

Если вы открыли терминал и печатаете там команды, потом открыли еще один, немного его поиспользовали, то новый терминал не «вспомнит» ни одной команды, напечатанной в первом. Вдобавок, при закрытии первого терминала второй перезапишет все команды в истории, введённые в первом. Вдвойне досадно!

Это происходит потому, что история bash сохраняется только когда вы закрываете терминал, а не после каждой команды. Чтобы исправить такое поведение, добавьте в ~/.bashrc строки:

shopt -s histappend PROMPT_COMMAND=`history -a`

Добавьте следующую строку, если переменная $PROMPT_COMMAND уже была задана :

PROMPT_COMMAND=‘$PROMPT_COMMAND; history -a’

Это заставит bash дополнять историю вместо того, чтобы перезаписывать её: каждый раз, когда показывается приглашение командной строки, последняя команда добавляется в историю.

Что делать с битыми символическими ссылками

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

$ find . -xtype l 2>/dev/null -exec rm {} \;

Часть этой команды rm {} превращается в команду «удалить файл».

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

Читайте также:  Как подключить просмотр ТВ Ростелеком к телевизору без приставки

$ rm file1 $ ln -s /apps/data/newfile file1

Log File Navigator – lnav и логи Linux

Одна из лучших утилит для просмотра логов это Log File Navigator или lnav. Установить её можно командой:

sudo apt install lnav

либо, если ты используешь дистрибутив, в репозиториях которого её нет, то вот ссылка на неё:

Основные фишки lnav это удобная подсветка, возможность чтения любых форматов логов, в том числе архивированных, возможность объединения нескольких файлов в единый отчет, удобный поиск и фильтрация, ну и всякое другое, по мелочи. Короче если часто лопатишь логи, штука мастхэвная.

Как пользоваться? Тут все просто. Если запустить программу без параметров:

то нам покажет журнал syslog. Если нужно посмотреть какой-то другой лог, то после lnav нужно указать какой именно, а если нужно увидеть несколько логов то просто их перечисляем, например:

lnav /var/log/ /var/log/

При этом, слева полоской будут выделены сообщения отдельного лога, а справа сверху будет написано к какому именно логу они относятся.

Если нужно открыть заархивированный лог то перед названием лога нужно добавить параметр -r. Ещё одна, иногда полезная функция – это гистограмма, если нажать кнопку i, то появится такой график, по которому видно в какое время сколько сообщений было добавлено в лог. Крайне полезно на серваках.

Естественно есть возможность поиска нужны строк. Для этого жмём кнопку ? и вводим слово для поиска, одновременно с этим видим подсказку по синтаксису поиска.

Изменение поведения в истории

Поведение истории Bash можно определить с помощью нескольких различных переменных среды . При изменении поведения истории установите переменные в ~/.bashrc или любом другом файле конфигурации, который загружается при входе пользователя в систему.

По умолчанию Bash сохраняет 500 строк в списке истории команд. Переменная HISTSIZE позволяет вам изменять это значение. Чтобы установить значение 10000, добавьте в файл .bashrc следующую строку:

HISTSIZE=10000

Переменная HISTCONTROL принимает список значений, разделенных двоеточиями, которые определяют способ сохранения команд в списке истории:

  • ignorespace — команды, начинающиеся с пробела, не сохраняются в списке истории.
  • ignoredups — повторяющиеся команды не сохраняются.
  • ignoreboth — это сокращение, включая как ignorespace и ignoredups .

HISTCONTROL=ignoreboth

Когда HISTTIMEFORMAT переменная HISTTIMEFORMAT , Bash HISTTIMEFORMAT времени выполнения команды в каждой строке.

Например, если вы установите:

HISTTIMEFORMAT=«%F %T: «

История будет отображаться в следующем формате:

413 2019-10-27 21:13:07: sudo nano /etc/hosts

Реестр

Так называется раздел программы, от которого все в восторге так же, как и от функции очистки файлов. Увы, если очистка файлов приносит очевидную выгоду — свободное место на жестком диске, то полезность чистки реестра — миф. Или как минимум преувеличение.

Реестр — это громадная база данных, где хранятся настройки Windows и программ. Там хранится больше ста тысяч записей. Даже самая «въедливая» программа для очистки реестра не найдет больше двух тысяч записей, которые ошибочны или не используются. Такое маленькое количество (0,01-0,02% от всех записей) погоды не сделает. Зато возможны проблемы, о них ниже.

Читайте также:  Вывести список файлов в каталоге или папке на компьютере

Первая проблема — предположительно ошибочные записи могут быть верными. Все чистильщики реестра, CCleaner в их числе, следуют следующей логике: если запись содержит адрес несуществующей папки или файла, то такая запись ошибочна и подлежит удалению. К сожалению, при этом не учитывается тот факт, что эта папка или этот файл могут появиться в будущем и запись сделана для этого. То есть это может быть настройка в какой-то программе для создания файла в определенном месте. Итог — вероятен сбой в программе, запись которой была удалена.

Вторая проблема — фрагментация реестра. Фрагментация — одна из проблем реестра Windows. Дело в том, что реестр хранится в нескольких файлах, которые могут быть раскиданы по всему жесткому диску. Да не просто раскиданы, но поделены на маленькие кусочки (фрагментация файлов). В итоге, чтобы прочитать одну запись, головке жесткого диска придется метаться туда-сюда по жесткому диску, что ощутимо замедляет операции. Хотя с этой проблемой Windows справляется, кэшируя (сохраняя заранее) содержимое реестра в быстрой оперативной памяти, существует проблема фрагментации самих данных внутри файлов, а именно внутри файлов реестра Windows. Представьте ситуацию: чтобы открыть файл из середины списка папки, вам придется выйти из этой папки, прокрутить список, зайти в папку с тем же именем и там отыскать этот файл. Вот примерно такая путаница возникает в записях реестра в процессе создания новых записей — физически записи записываются не рядом друг с другом (там уже все занято, а файл «растягиваться» не умеет), а в конец файла. После такой путаницы компьютер с установленной Windows начинает тормозить. Обычно это становится заметно спустя полгода-год работы. Никакая чистка реестра не поможет, только его дефрагментация, а CCleaner не умеет дефрагментировать. Более того, после удаления записей на их место не записываются новые, в итоге появляется что-то вроде неиспользуемых пустых пространств в структуре файлов реестра, по факту это увеличение фрагментации записей реестра.

Перечислю то, что пытается вычистить из реестра Ccleaner:

В принципе, очистку реестра с помощью CCleaner вы спокойно можете делать, потому что перед «исправлением ошибок» предлагается создать файл резервной копии. В случае возникновения глюков можно два раза щелкнуть мышью по этому файлу, согласиться с появившимся вопросом — удаленные записи реестра восстановятся. Минус всего этого — фрагментация увеличится примерно на 0,0001%, что не критично в краткосрочной перспективе, но если делать так ежедневно, то ждите тормозов.

Итог: никакой выгоды от чистки реестра не будет, но ускорение Windows вы можете ощутить из-за эффекта плацебо. А в случае проблем можно восстановить реестр из резервной копии.

Как удалить каталоги с помощью rmdir

Есть еще одна команда rmdir , которую вы можете использовать для удаления каталогов. Разница между rm и rmdir том, что rmdir может удалять только пустые каталоги. Он никогда не удалит файлы.

Самый простой случай — удаление одного пустого каталога. Как и в случае с rm , вы можете передать несколько имен каталогов в rmdir или rmdir путь к каталогу.

Удалите один каталог в текущем каталоге, передав его имя в rmdir :

Как удалить каталоги с помощью rmdir

Удалите несколько каталогов, передав список имен в rmdir :

Читайте также:  Как отключить подписки на МТС

Удалите каталог не в текущем каталоге, указав полный путь к этому каталогу:

Если вы попытаетесь удалить не пустую папку, rmdir выдаст вам сообщение об ошибке. В следующем примере rmdir успешно и без вывода сообщений удаляет каталог clients но отказывается удалять каталог projects поскольку он содержит файлы. Каталог projects остается точно таким, каким он был, а файлы в нем нетронутыми.

Когда rmdir выдает ошибку «Directory not empty», он прекращает обработку каталогов, переданных ему в командной строке. Если вы попросили удалить четыре каталога, а в первом содержались файлы, rmdir выдаст вам сообщение об ошибке и больше ничего не сделает. Вы можете заставить его игнорировать эти ошибки с –ignore-fail-on-non-empty чтобы обрабатывать другие каталоги.

В следующем примере две папки были переданы в rmdir , это work/reports и work/quotes. Параметр –ignore-fail-on-non-empty включен в команду. В папке work/reports находятся файлы, поэтому rmdir не может удалить ее. Опция –ignore-fail-on-non-empty заставляет rmdir игнорировать ошибку и переходить к следующей папке, которую он должен обработать, это work/quotes. Это пустая папка, и rmdir удаляет ее.

Как удалить каталоги с помощью rmdir

Эта команда использовалась.

Вы можете использовать опцию -p (parent), чтобы удалить каталог, а также удалить его родительские каталоги. Этот прием работает, потому что rmdir начинается с целевого каталога, а затем возвращается к родительскому. Теперь этот каталог должен быть пустым, поэтому он может быть удален rmdir, и процесс повторяет шаг назад по пути, предоставленному rmdir.

В следующем примере команда, переданная в rmdir:

Каталоги invoices и work удаляются по запросу.

Используете ли вы Bash или любую другую оболочку? Linux предоставляет гибкие и мощные команды для удаления каталогов и файлов прямо из командной строки терминала. Некоторые люди предпочитают иметь рабочий процесс, который вращается вокруг терминала. У других может не быть выбора в этом вопросе. Они могут работать на серверах без установленного графического интерфейса или в удаленном сеансе в автономной системе, такой как Raspberry Pi. Эти команды идеально подходят для этой группы людей.

Как удалить каталоги с помощью rmdir

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

Использование debfoster

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

sudo debfoster -q

Вы всегда можете отредактировать файл / var / lib / debfosterkeepers, который определяет пакеты, которые вы хотите оставить в вашей системе.

Для редактирования типа файла хранителей

sudo vi /var/lib/debfoster/keepers

Чтобы заставить debfoster удалить все пакеты, которые не указаны в этом списке, или зависимости пакетов, перечисленных в этом списке. Он также добавит все пакеты в этом списке, которые не установлены. Таким образом, ваша система будет соответствовать этому списку. Сделай это

sudo debfoster -f

Чтобы отслеживать то, что вы устанавливали дополнительно, делайте это время от времени:

sudo debfoster