Похоже, вы не можете сделать это с помощью dircolors
, но вы можете сделать это, изменив LS_COLORS
напрямую:
eval "$(dircolors)"
LS_COLORS="${LS_COLORS}*~=01;34:"
export LS_COLORS
dircolors
, похоже, обрабатывает только три типа дескрипторов: имена терминалов (начиная с TERM
), типы файлов (e. например DIR
), и расширения, начинающиеся с .
. Последние расширяются с помощью префикса *
; таким образом, ваш .*~
становится *.*~
, который соответствует только файлам резервных копий, содержащим .
. ls
сам может интерпретировать более общие записи LS_COLORS
, такие как *~
, который соответствует всем файлам, заканчивающимся на ~
.
Вы можете скрыть сообщение об ошибке с помощью 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
Чтобы определить, расширяется ли шаблон имени файла во что-либо, вы можете использовать
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
-подобной оболочке.
В продолжение комментария Стефана Шазеласа к ответу Кусалананды:
$ 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