Вы можете использовать тайм-аут GRUB для разрешения пользователю отключить систему
В /etc/default/grub
установите GRUB_TIMEOUT=30
для 30-секундного тайм-аута перед загрузкой по умолчанию, чтобы пользователь мог отключить питание перед загрузкой Linux.
Пока вы находитесь в меню GRUB, ожидая тайм-аута, вся система находится в состоянии -только для чтения, поэтому отключение питания не должно причинить вреда.
Grub также позволяет отображать фоновое изображение, которое, например, может отображать огромный жирный текст, указывающий пользователю, что безопасно отключать питание.
Плюсы:
reboot
и poweroff
работают как в обычной системе. Минусы:
Следующая команда find
найдет каждый конечный каталог в текущем каталоге и выполнит в нем скрипт:
find. -type d -links 2 -execdir /path/to/script.sh some arguments here \;
Это приведет к выполнению команды, данной -execdir
в каждом конечном каталоге в текущем каталоге.
То же самое, но использованиеzsh
(не учитывает скрытые имена):
for dirpath in./**/*(/l2); do
( cd "$dirpath" && /path/to/script.sh some arguments here )
done
Шаблон ./**/*(/l2)
расширялся бы до пути к любому каталогу-листу в текущем каталоге. **
рекурсивно сопоставляется со структурой каталогов, в то время как *(/l2)
будет соответствовать любому имени, которое является каталогом с количеством ссылок ровно 2 (, то есть это каталог без подкаталогов, факт, также используемый командой find
выше ).
Обратите внимание, что в некоторых файловых системах, таких как APFS от Apple, количество ссылок на каталоги может превышать 2, даже если в них нет подкаталогов. В BTRFS количество ссылок для каталогов всегда равно 1. Поэтому это решение не будет работать в этих файловых системах.
Связанные:
**/*
/
:**/*(/)
glob_dots
, добавьте квалификатор glob D
, чтобы включить совпадения, начинающиеся с точки. N
, чтобы список совпадений был пустым:**/*(/DN)
Теперь, когда у вас есть список подкаталогов, чтобы получить только конечные каталоги, проверьте для каждого каталога наличие подкаталога :проверьте, не пусто ли *(/DN)
.Вы можете добавить квалификатор glob Y1
, чтобы перестать перечислять совпадения после первого.
for d in **/*(/DN); do
sub=($d/*(/DNY1))
if (($#sub)); then continue; fi
process_leaf_directory $d
done
Для большинства файловых систем существует более простой способ :конечный каталог имеет число ссылок, равное 2 (только запись для него в его родительском каталоге и его .
запись, тогда как не -конечный каталог также имеет записи ..
в своих подкаталогах ). Это упрощает фильтрацию. :Проверка количества ссылок, равного 2, с помощью квалификатора glob l
.
for d in **/*(/DNl2); do
process_leaf_directory $d
done