Выбирайте только каталоги и упорядочивайте их в конкретный способ с помощью echo

Это будет зависеть от конкретной разновидности задействованного ps , но может запускать что-то вроде

zstyle ':completion:*:processes' command 'ps -A'
3
21.01.2017, 19:37
5 ответов

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

ls -d */ | sort -t_ -n -k2
1
27.01.2020, 21:10

Для сортировки записей по правильному порядку номеров (например, 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
1
27.01.2020, 21:10

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

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

glob * перечисляет все файлы (кроме файлов точек), затем квалификатор glob / выбирает только те, которые являются каталогами, а 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
3
27.01.2020, 21:10
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 , в конце имени которого указан этот номер (с подчеркиванием перед Это). Если это каталог, делайте с ним все, что вам нужно. Этот синтаксис требует либо 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
2
27.01.2020, 21:10

измените его вот так... и попробуйте

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`
2
27.01.2020, 21:10

Теги

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