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

Я не имею опыта в среде 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 
  • Как узнать, написан ли сценарий оболочки в bash или sh
  • извлекать каждый n-й символ из строки
  • Как использовать inotifywait для просмотра каталога для создания файлов определенного расширения
  • Переименование содержимого всей папки
  • Что не так с этим вызовом sed -i?
  • Debian: настройка пути для узла с правами доступа, доступными глобально
  • Какие символы нужно избегать в файлах без кавычек?
  • как разделить буферизацию на меньшие файлы csv
  • Предотвращение активного удаления файлов в файловой системе NFS
  • Как я могу читать строки за строкой из переменной в bash?
  • Файлы инициализации Shell
  • Interesting Posts

    Почему мой сервер прерывает ssh-соединения?

    Ubuntu автоматически подключается к беспроводной сети, когда она уже подключена eth0 к той же сети

    Каково значение «7» в «man 7 regex»?

    Segfault пытается получить доступ к пользователям в настройках

    Политика Open Source: как это получается? Решения, полномочия и пол

    Разрешить всем пользователям писать файлы / папки пользователя «apache»?

    Простой TCP-сервер, прослушивающий порт, но не возвращающий SYN-ACK

    Что происходит в UNIX / Linux, когда программа больше, чем размер памяти?

    Как установить Timeout для команды ssh, а также вернуть результат удаленных команд

    iptables не сохраняется? CentOS

    Возможно ли использовать bash -c 'bashrc?

    Что мне делать с профилями btrfs?

    Создание загрузочной резервной копии системного диска

    Как назначить переменные среды параллельно в bash

    Учитывая git commit hash, как узнать, какая версия ядра содержит его?

    Linux и Unix - лучшая ОС в мире.