Шаблон Bash для соответствия всем файлам, но каталогам

Учитывая Вас управляют init.d сценарием для запуска этого процесса, как который Вы могли бы хотеть просто перенести выполнение своего процесса в init.d сценарии так:

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

Этот будет lanch Ваш процесс в до цикла в основном навсегда, каждый раз, когда он умирает. Подсчет и т.д. мог быть представлен как это:

cnt=0
max=3
until myserver; do
    let cnt=cnt+1
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
    [ $cnt = $max ] && exit;
done
5
13.07.2014, 23:40
5 ответов
[
find . -maxdepth 1 ! -type d
] [

]Детали:[

] [
    ] [
  • ][

    ][]-maxdepth 1[] ограничивает поиск текущей директорией[

    ][
  • ] [
  • ][

    ][]! -тип d[] исключает директории[

    ][
  • ] [
]
6
27.01.2020, 20:31
[

] Причина, по которой []*/[] совпадает с каталогами, заключается в том, что итоговый []/[] ограничивает количество совпадений с каталогами. Этот эффект срабатывает только в том случае, если []/[] находится после шаблона, в [] нельзя использовать []/[] внутри скобок!(*/)[]. В bash нет встроенной возможности делать то, что вам нужно.[

] [

]Вы можете сделать цикл над всеми файлами и собрать массив.[

] [
non_directories=()
for x in *; do
  [ -d "$x" ] || non_directories+=("$x")
done
somecommand "${non_directories[@]}"
] [

]Вы также можете использовать []find[], если вы хотите выполнить команду над всеми файлами. Если ваша реализация find поддерживает ее (GNU, BSD, BusyBox), используйте []-mindepth[] и []-maxdepth[], чтобы перечислить только записи в текущих каталогах (с добавлением []./[]). Используйте []! -имя .*'[], чтобы пропустить файлы точек (если вы действительно хотите их пропустить).[

] [
find . -mindepth 1 -maxdepth 1 ! -type d -exec somecommand {} +
] [

] Если вы можете предположить, что POSIX [] find[], используйте []-prune[], чтобы избежать повторения. [

] [
find . -name . -o -type d -prune -o -exec somecommand {} +
] [

] Если вы хотите вставить вывод []find[] в переменную массива, остерегайтесь, что при разборе вывода []find[] требуются дополнительные предположения об имени файла. Лучше использовать цикл.[

] [

]В zsh можно использовать []glob-квалификаторы[]: []*(^/)[], или []*(...)[], чтобы соответствовать только обычным файлам.[

].
6
27.01.2020, 20:31
[

] Своего рода длинная намотка, но:[

] [
for f in *; do if [ ! -d "$f" ]; then echo "$f"; fi; done
] [

][]-d[] является []файловым оператором тестирования [] для проверки, является ли аргумент каталогом.[

] [

]Вышеуказанное можно также сократить до[

] [
for f in *; do [ ! -d "$f" ] && echo "$f"; done
]
3
27.01.2020, 20:31
[

]Я не уверен, какой из 2-х вариантов вы хотите достичь - bash globing, который исключает основываясь на атрибутах файловой системы, или способ отображения только файлов в каталоге?[

] [

]Если первый, то я не уверен, что это возможно. Глобус просто расширяется, и имена файлов являются базой в любом каталоге - bash не различает имя файла или грязное имя по собственному.[

] [

]Если второй - у вас уже есть 2 ответа, другой с использованием ls: [

] [
ls -dF * | grep -v "/$"  
]
2
27.01.2020, 20:31

Мое предложение:

GLOBIGNORE=$(echo */)            # create list of directories with globbing
GLOBIGNORE=${GLOBIGNORE//:/\\:}  # escape possible ":" with "\" to allow
                                 # the separator ":" in directory names
GLOBIGNORE=${GLOBIGNORE//\/ /:}  # replace "/ " with separator ":" 
GLOBIGNORE=${GLOBIGNORE%/}       # remove trailing "/"
ls -ld *

Результат: никаких каталогов

Вернуться к настройкам по умолчанию с помощью отменить GLOBIGNORE

2
27.01.2020, 20:31

Теги

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