Выбирайте только каталоги и порядок с помощью эха

Я не имею опыта в среде Unix и должен настроить скрипт. Я думаю, это базовые знания, но я не мог найти простого решения, выполнив его.

Скрипт получает все webappsrv в каталоге, чтобы перезапустить их:

TMPLIST=`cd $MYWEBAPPSRV_DIR; /bin/echo *` 

Таким образом, это возвращает список:

 myAppSrv_1 myAppSrv_11 myAppSrv_12 myAppSrv_2 myAppSrv_3 ... myApSrv_9 somescript somemorescriptfiles 

Как я могу исключить файлы сценариев и выбирать только нужные каталоги? И как я могу изменить порядок простым способом, потому что серверы нужно перезапустить с помощью числового номера (1, 2, 3, …, 11, 12)? Я не могу переименовать каталоги. Я знаю, что можно будет разбивать каталоги в текстовых и числовых частях, а затем переупорядочивать по числовой части, но есть ли более простой вариант, например специальный параметр сортировки?

5 Solutions collect form web for “Выбирайте только каталоги и порядок с помощью эха”

измените это так … и попробуйте

 TMPLIST=`cd $MYWEBAPPSRV_DIR; ls -l | awk '/myApp/{print $NF}' | sort -t_ -n -k2` TMPLIST=`cd $MYWEBAPPSRV_DIR; ls -1 | awk '/myApp/' | sort -t_ -n -k2` 

Zsh доступен в большинстве дистрибутивов, но часто не является частью стандартной установки. Если установка не является проблемой, используйте ее, так как ее функция отбора glob очень легко решает вашу проблему:

 #!/bin/zsh cd $MYWEBAPPSRV_DIR TMPLIST=(*(/n)) for app in $TMPLIST; do … done 

Glob * перечисляет все файлы (кроме файлов точек), затем glob qualifier / выбирает только те, которые являются каталогами, и n вызывает численную сортировку для последовательностей цифр вместо стандартного лексикографического порядка. Если вы не хотите менять каталог, но хотите исключить часть каталога из совпадений, используйте модификатор расширения истории, чтобы сохранить только основную часть имени:

 #!/bin/zsh TMPLIST=($MYWEBAPPSRV_DIR/*(/n:t)) for app in $TMPLIST; do … done 

Если установка zsh непрактична, и вы используете систему с GNU coreutils (например, не встроенный Linux, Cygwin), а имена файлов не содержат специальных символов (пробельные символы или маски), то вы можете использовать ls -v для сортировки имена файлов с числовым порядком для последовательностей цифр и -F для отображения типов файлов в сочетании с текстовым фильтром для выбора только каталогов.

 TMPLIST=$(ls -Fv $MYWEBAPPSRV_DIR | sed -n 's!/$!!p') for app in $TMPLIST; do … done 
 for (( n = 1; n < 12; ++n )); do for appsrv_dir in "$MYWEBAPPSRV_DIR"/*_"$n"; do if [[ -d "$appsrv_dir" ]]; then ( cd "$appsrv_dir" && somecommand ) fi done done 

Это повторяется с номерами от 1 до 12 и соответствует $MYWEBAPPSRV_DIR каталоге $MYWEBAPPSRV_DIR который имеет это число в конце своего имени (с подчеркиванием перед ним). Если это каталог, сделайте все, что вам нужно. Этот синтаксис требует либо bash либо ksh .

«12», очевидно, должно быть наивысшим числовым суффиксом любой директории в $MYWEBAPPSRV_DIR .

Другой способ сделать это, с явной сортировкой имен каталогов: во-первых, составить список каталогов:

 for thing in "$MYWEBAPPSRV_DIR"/*_[0-9] "$MYWEBAPPSRV_DIR"/*_[0-9][0-9] do if [[ -d "$thing" ]]; then printf '%s\n' "$thing" fi done 

Это проходит через все в каталоге $MYWEBAPPSRV_DIR , у которого есть имя файла, заканчивающееся на _ за которым следует одна или две цифры, и отправляет эти имена файлов в стандартный вывод, если они фактически являются именами каталогов.

Затем отсортируйте эти имена на основе числа после _ :

 for thing in "$MYWEBAPPSRV_DIR"/*_[0-9] "$MYWEBAPPSRV_DIR"/*_[0-9][0-9] do if [[ -d "$thing" ]]; then printf '%s\n' "$thing" fi done | sort -t '_' -k2,2n 

Предполагая, что в имени есть только одно подчеркивание, это сортирует имена в порядке возрастания по порядку на основе числа в суффиксе. Утилита sort читает со стандартного ввода и записывает отсортированный список каталогов в стандартный вывод.

Затем сделайте все, что вам нужно сделать с этими каталогами:

 for thing in "$MYWEBAPPSRV_DIR"/*_[0-9] "$MYWEBAPPSRV_DIR"/*_[0-9][0-9] do if [[ -d "$thing" ]]; then printf '%s\n' "$thing" fi done | sort -t '_' -k2,2n | while read appsrv_subdir; do ( cd "$MYWEBAPPSRV_DIR/$appsrv_subdir" && somecommand ) done 

Если вам не нужно исключать любые каталоги, которые вы также можете сделать:

 ls -d */ | sort -t_ -n -k2 

Для сортировки записей с помощью правильного числового порядка (например, 1, 2, 3, […], 9, 10, 11, 12) вместо сортировки символов (например, 1, 10, 11, 12, 2, 3, [.. .], 9) вы можете использовать команду ls с опцией -v и напечатать по одной в строке с опцией -1 .

Измените свою команду на TMPLIST="$(ls -v1 $MYWEBAPPSRV_DIR)" чтобы создать список со всеми файлами в правильном порядке.

Я не совсем уверен, что вы имеете в виду, когда говорите, что вам нужен только каталог, а не файл. Если я неправильно понял, пожалуйста, уточните. Вот сценарий, который, учитывая путь, выполнит некоторый код, если это файл или другой код, если он является каталогом. Сохраните путь, который нужно проверить в переменной с именем $ test, чтобы это работало.

 if [ "$(ls -ld $test | grep '^d')" != "" ] then echo "Directory code here" else echo "File code here" fi 
  • Разберите XML-файл, чтобы скопировать содержимое в другой файл в определенном месте в файле?
  • Чтение пространства в качестве входного файла в сценарии оболочки
  • Печатать содержимое файла и удалять напечатанное содержимое * из файла
  • grep для текста, который может или не может присутствовать
  • Запуск сценариев оболочки через веб-сайт
  • Нельзя отступать heredoc, чтобы соответствовать отступу вложенности
  • Как использовать тройник для захвата STDOUT из кодового блока в имя файла, определенное в блоке?
  • Избегайте расширения обратной косой черты с эхом в тире
  • Расширенное использование / команда оболочки
  • Проверьте, начинаются ли две строки с одним и тем же символом, если это означает, что среднее выходное значение, если нет, выводит фактическое значение
  • Как добавить текст в выходной файл?
  • Linux и Unix - лучшая ОС в мире.