Как узнать, есть ли файлы в папке, и выйти соответственно (в KSH)

Похоже, вы не можете сделать это с помощью dircolors, но вы можете сделать это, изменив LS_COLORS напрямую:

eval "$(dircolors)"
LS_COLORS="${LS_COLORS}*~=01;34:"
export LS_COLORS

dircolors, похоже, обрабатывает только три типа дескрипторов: имена терминалов (начиная с TERM), типы файлов (e. например DIR), и расширения, начинающиеся с . . Последние расширяются с помощью префикса *; таким образом, ваш .*~ становится *.*~, который соответствует только файлам резервных копий, содержащим . . ls сам может интерпретировать более общие записи LS_COLORS, такие как *~, который соответствует всем файлам, заканчивающимся на ~.

5
09.05.2019, 15:01
3 ответа

Вы можете скрыть сообщение об ошибке с помощью 2>/dev/nullвнутри ls.

Затем вы можете проверить, пусто ли $CONTENTSс помощью-z

CONTENTS=$(ls -d -- "${gp_path}ALLSTUFF"*.zip 2>/dev/null)
if [ -z "$CONTENTS" ]; then
    print 'EMPTY'
    exit 0
else
    print 'NOT EMPTY'
fi
5
27.01.2020, 20:32

Чтобы определить, расширяется ли шаблон имени файла во что-либо, вы можете использовать

set -- "$gp_path"ALLSTUFF*.zip

if [ -e "$1" ]; then
    echo matched something
else
    echo did not match anything
    exit 1
fi

Команда setустанавливает позиционные параметры для имен файлов, соответствующих шаблону, и если первое совпадающее имя файла существует, то оно соответствует чему-то. Шаблон остается нераскрытым, если он ничему не соответствует.

Это можно использовать в ksh, bashи любой другойsh-подобной оболочке.

3
27.01.2020, 20:32

В продолжение комментария Стефана Шазеласа к ответу Кусалананды:

$ ksh
$ echo ${.sh.version}
Version AJM 93u+ 2012-08-01
$ ls
TABLE1.csv  TABLE2.csv

Используйте массив для хранения файлов. Начните с выражения glob, которое соответствует некоторым файлам:

$ typeset -a files
$ files=( ~(N)*.csv )
$ echo "${#files[@]}"
2
$ typeset -p files
typeset -a files=(TABLE1.csv TABLE2.csv)

Теперь «голый» глобус, который не соответствует, чтобы продемонстрировать, что несоответствующий глобус -заменяется шаблоном глобуса в виде строки:

$ files=( *.txt )
$ echo "${#files[@]}"
1
$ typeset -p files
typeset -a files=('*.txt')

Теперь с префиксом "null glob"

$ files=( ~(N)*.txt )
$ echo "${#files[@]}"
0
$ typeset -p files
(empty output)
$

См. раздел «Генерация имени файла» на справочной странице ksh.


Чтобы ответить конкретно на ваш вопрос:

typeset -a contents=( ~(N)"$gp_path"/ALLSTUFF*.zip )
if [[ ${#contents[@]} -eq 0 ]]; then
    print 'EMPTY'
    exit 0
else
    print 'NOT EMPTY'
fi

Вы должны избавиться от привычки использовать имена переменных ALLCAPS.

См. также:https://mywiki.wooledge.org/ParsingLs

7
27.01.2020, 20:32

Теги

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