Как удалить неработающие символические ссылки за один раз?

Предположительно эти письма отправляются в результате

mdadm --monitor --scan --oneshot

в /etc/cron.daily/mdadm, что заставляет mdadm "замечать" деградировавший массив каждый день. Это включает новый процесс mdadm, запускающий новое сканирование каждый день, поэтому он каждый раз замечает деградировавший массив впервые.

4
12.10.2016, 02:52
5 ответов

Этот простой лайнер выполняет работу довольно быстро, требует GNU find :

find . -xtype l -delete

Небольшое пояснение:

-xtype l тесты на наличие неработающих ссылок (противоположность -типа )

-delete удаляет файлы напрямую, не нужно больше беспокоиться о xargs или ] -exec

ПРИМЕЧАНИЕ: -xtype l означает -xtype нижний регистр L (как в ссылка );)

GNU Findutils: Найти

56
27.01.2020, 20:46

С помощьюzsh(вы фактически используете синтаксис zshв своем коде; с bashвам нужно будет указать эти переменные):

rm -- $target/*(-@)

Или:

rm -- $target/<20150101-20151231>.log.gz(-@)

*(@)соответствует файлам типа символическая ссылка . *(-@)— это те, которые все еще имеют тип символическая ссылка после разрешения символической ссылки (, то есть те, для которых цель символической ссылки не может быть разрешена ). Это эквивалентно GNU find-xtype l.

В zshи с GNU lnцикл лучше писать как:

ln -srt $target -- $origin/<20150101-20151231>.log.gz

Что также будет работать, даже если $originсодержит относительный путь (и создает относительные символические ссылки, что снижает риск разрыва символических ссылок, если некоторые компоненты пути источника (являются общими. с целью )в будущем будут переименованы ).

2
27.01.2020, 20:46
find -L /path -type l -exec rm -i {} \;

С помощью -Lfindпытается перейти по символическим ссылкам для оценки теста -type. Если ему удастся перейти по ссылке, то ссылка не разорвана, и тест -type lбудет ложным (, поскольку он оценивается для того, что ссылка разрешает в ). Если не удается перейти по ссылке, то ссылка не работает, и тест -type lбудет верным.

Если проверка -type lпрошла успешно, то -exec rm {} \;удаляет неработающую ссылку.

Предложение использовать -xtype lявляется GNU-измом, в первую очередь для пользователей Linux, и не будет работать на системах UNIX, отличных от -GNU, таких как Solaris, FreeBSD и т. д.

7
11.08.2020, 15:17

Если все неработающие ссылки были созданы ошибкой cmd в заданную временную метку, то ниже работает нормально.

ls -lrt | grep "Sep 17 15:06" | awk '{print $9}' | xargs \rm
0
17.09.2020, 22:19

Ответ Роба Каррента, безусловно, полезен и работает.

Еще один пример можно найти в man findв macOS для удаления всех неработающих символических ссылок в заданном каталоге.

Допустим, у вас есть каталог /usr/ports/packages, содержащий неработающие символические ссылки на другие файлы или каталоги, которые были либо перемещены, либо удалены. Следующая команда удалит все символические ссылки, для которых ранее связанное местоположение файла больше не существует.

EXAMPLES
    The following examples are shown as given to the shell:
   ...
    
    find -L /usr/ports/packages -type l -exec rm -- {} +
           Delete all broken symbolic links in /usr/ports/packages.
    ...
BSD                           September 28, 2011                           BSD

Переключатель -L(в соответствии сman find)приводит к тому, что информация о файле и тип файла, возвращаемые для каждой символической ссылки, соответствуют файлу, на который ссылается ссылка, а не самой ссылке. Однако, если указанный файл не существует, информация о файле и его тип будут для самой ссылки.

Переключатель -type lограничивает найденные файлы теми файлами, которые являются символическими ссылками.

За переключателем -execследует команда, которую нужно выполнить для сопоставления файлов.

Переключатель --приводит к тому, что rm, который использует getopt (3 )для разбора своих аргументов, после этого прекращает обработку флаговых опций.

Как поясняется в man find, синтаксис exec utility [argument...] {} +имеет тот же эффект, что и -exec, за исключением того, что ``{}'' заменяется максимально возможным количеством путей для каждого вызова утилиты. Это поведение похоже на xargs (1 ).

Надеюсь, это было полезно.

1
22.12.2020, 01:27

Теги

Похожие вопросы