Предположительно эти письма отправляются в результате
mdadm --monitor --scan --oneshot
в /etc/cron.daily/mdadm
, что заставляет mdadm
"замечать" деградировавший массив каждый день. Это включает новый процесс mdadm
, запускающий новое сканирование каждый день, поэтому он каждый раз замечает деградировавший массив впервые.
Этот простой лайнер выполняет работу довольно быстро, требует GNU find
:
find . -xtype l -delete
Небольшое пояснение:
-xtype l
тесты на наличие неработающих ссылок (противоположность -типа
)
-delete
удаляет файлы напрямую, не нужно больше беспокоиться о xargs
или ] -exec
ПРИМЕЧАНИЕ: -xtype l означает -xtype нижний регистр L (как в ссылка );)
С помощью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
содержит относительный путь (и создает относительные символические ссылки, что снижает риск разрыва символических ссылок, если некоторые компоненты пути источника (являются общими. с целью )в будущем будут переименованы ).
find -L /path -type l -exec rm -i {} \;
С помощью -L
find
пытается перейти по символическим ссылкам для оценки теста -type
. Если ему удастся перейти по ссылке, то ссылка не разорвана, и тест -type l
будет ложным (, поскольку он оценивается для того, что ссылка разрешает в ). Если не удается перейти по ссылке, то ссылка не работает, и тест -type l
будет верным.
Если проверка -type l
прошла успешно, то -exec rm {} \;
удаляет неработающую ссылку.
Предложение использовать -xtype l
является GNU-измом, в первую очередь для пользователей Linux, и не будет работать на системах UNIX, отличных от -GNU, таких как Solaris, FreeBSD и т. д.
Если все неработающие ссылки были созданы ошибкой cmd в заданную временную метку, то ниже работает нормально.
ls -lrt | grep "Sep 17 15:06" | awk '{print $9}' | xargs \rm
Ответ Роба Каррента, безусловно, полезен и работает.
Еще один пример можно найти в 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 ).
Надеюсь, это было полезно.