Найдите все сценарии оболочки из папки и выполните их в порядке

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

0
16.11.2018, 23:02
2 ответа

Вероятно, существует более простой способ последовательного подстановки имен файлов с помощью zsh, но вот -метод грубой силы в bash:

for script in ?.script*.sh ??.script*.sh ???.script*.sh ????.script*.sh
do
  printf "Executing script: %s\n" "$script"
 ./"$script"
done

Это предполагает, что у вас есть не более 9999 скриптов --или, точнее, ни одного с более чем 4 цифрами (символов )в префиксной части имени файла.

Также предполагается, что префиксы пронумерованы--он будет подбирать скрипты с именами, например. go.script_X.sh, если он у вас есть. Чтобы обойти , что ,замените ?на [0-9]на:

for f in [0-9].script*.sh [0-9][0-9].script*.sh...

Естественным механизмом подстановки в оболочке будет сортировка результирующих имен файлов в алфавитном порядке, что приводит к их сортировке и по числовым значениям. Различные имена файлов указываются в возрастающем масштабе, так что «9» сортируется перед «101» и т. д.

В zsh объединяйте имена файлов в порядке номеров их префиксов с помощью:

for script in *.script*.sh(oe_'REPLY=${REPLY%%.*}'_n)
do
  printf "Executing script: %s\n" "$script"
 ./"$script"
done

Расширение подстановки сначала выбирает все *.script*.shфайлы, а затем приказывает order (отсортировать )их с помощью выражения e, которое извлекает префикс, удаляя как можно больше «точек, следующих за чем угодно", насколько это возможно, и используя nчисловую сортировку.

2
28.01.2020, 02:18

Если имена файлов простые (без пробелов, без новой строки, без символов, которые ls необходимо кодировать с помощью ?), тогда, может быть !!, вы можете обойтись:

IFS=$' \t\n'; for s in $(ls -v folder/*.script.sh); do printf '%s\n' "$s"; done

В этом случае lsбудет сортироваться по номеру версии -v(, очень похожему на числовое значение ).

Но вообще, анализ (обработки )вывода ls— плохая идея.

Так лучше:

shopt -s nullglob
for   s   in   folder/?{,?{,?{,?}}}.script.sh
do    printf '%s\n' "$s"
done

Который будет перечислять (в алфавитном порядке, что эквивалентно числовому порядку, если символы перед .script.shявляются только числами )по каждому символу до четырех символов (числа ).

Идея состоит в том, что раскрытие фигурных скобок происходит до раскрытия имени пути . Расширение фигурной скобки преобразует и расширяет ?{,?{,?{,?}}}.script.shв

.
?.script.sh ??.script.sh ???.script.sh ????.script.sh

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

Если ни один из приведенных выше вариантов не подходит, вам нужно будет использоватьsort:

printf '%s\n' *.script.sh | sort -n | xargs echo

Что становится еще сложнее, если есть префикс folder:

printf '%s\n' folder/*.script.sh | sort -n -k 1.8 | xargs echo

Где 8 — это количество символов (байтов )в слове folderи последующем /плюс один (1 ).

Вам нужно будет заменить echoна shдля выполнения каждого скрипта. Это будет работать правильно, если имя файла не содержит символов новой строки.

Если возможно, что имена файлов могут содержать новые строки, используйте это:

printf '%s\0' folder/*.script.sh | sort -zn -k 1.8 | xargs -0 -I{} echo '{}'

Снова замените echoнаsh(илиbash)для выполнения сценариев.

2
28.01.2020, 02:18

Теги

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