zsh - Как запустить скрипт в конечных каталогах?

Вы можете использовать тайм-аут GRUB для разрешения пользователю отключить систему

В /etc/default/grubустановите GRUB_TIMEOUT=30для 30-секундного тайм-аута перед загрузкой по умолчанию, чтобы пользователь мог отключить питание перед загрузкой Linux.

Пока вы находитесь в меню GRUB, ожидая тайм-аута, вся система находится в состоянии -только для чтения, поэтому отключение питания не должно причинить вреда.

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

Плюсы:

  • Очень просто реализовать
  • Вероятно, не сломается при обновлении системы
  • Можно легко давать пользователю инструкции о том, что делать.
  • Минимальный риск повреждения системы при отключении питания
  • Стандартные команды rebootи poweroffработают как в обычной системе.

Минусы:

  • Каждая загрузка задерживается на 30 секунд
2
03.10.2019, 09:54
2 ответа

Следующая команда 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. Поэтому это решение не будет работать в этих файловых системах.

Связанные:

3
27.01.2020, 21:51

Теперь, когда у вас есть список подкаталогов, чтобы получить только конечные каталоги, проверьте для каждого каталога наличие подкаталога :проверьте, не пусто ли *(/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
4
27.01.2020, 21:51

Теги

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