LINUX.ORG.RU

Проверка существования файла, начинающегося на...

 


0

1

Допустим, нам надо проверить, есть ли директория, начинающаяся на bi*.

[[ -d bi* ]]&&echo yes
не работает.
[[ $(ls -d bi* &>/dev/null) ]]&&echo yes
не работает
test $(ls -d bi*)&>/dev/null &&echo yes
работает, но если такого файла не будет, ls засоряет вывод

★★★★★
first-arg-exists() { [[ -e $1 ]]; }

first-arg-exists bi*/ && echo yes
anonymous
()

Почему ты не используешь для этого find?
А если на баше, то лично я бы писал так:

for dir in bi* ; do
    [ -d "${dir}" ] && echo "yes" && break
done

UPD: заменил [[ на [ во имя переносимости.

beresk_let ★★★★★
()
Последнее исправление: beresk_let (всего исправлений: 1)
Ответ на: комментарий от evilface

А вообще
(( 0 < `find -maxdepth 1 -type d -name 'bi*' | wc -l` )) && echo yes

evilface ★★
()
Ответ на: комментарий от teod0r

Только не имеет отношения к каталогам, а проверяет файлы вообще.

Zmicier ★★★★★
()
Ответ на: комментарий от Flagitio

В случае ls | grep могут сильно испачкать малину нестандартные символы в именах файлов. Не стоит парсить вывод ls.

beresk_let ★★★★★
()

И по поводу shopt: это точно сработает в bash и — вполне вероятно — в некоторых других шеллах, но не во всех. Впрочем, это зачастую не принципиально.

beresk_let ★★★★★
()
Ответ на: комментарий от teod0r

не сработает, если будет несколько совпадений

Да даже шире — оно вернет «ложь» тогда и только тогда, когда будет несколько каталогов на шаблон. Один каталог — истина, ни одного — тоже истина.

Zmicier ★★★★★
()
Ответ на: комментарий от beresk_let

Ещё по поводу shopt. В скриптах, использующие подобные конструкции, нужно проверять/выставлять значения shopt, в bash'е есть не только ″nullglob″, но и ″failglob″ и неведомо, что там у пользователя в .bashrc.

mky ★★★★★
()
Ответ на: комментарий от evilface

В итоге так работает и там, и там:
test $(ls -d bi* 2>&-) 1>&- && echo yes

evilface ★★
()

тебе надо почитать про shopt, в частности на поведение nullglob в комбинации с failglob

bl ★★★
()
Ответ на: комментарий от teod0r

Массив инициализируют же.

   Arrays are assigned to using compound assignments of the form
     NAME=(VALUE1 VALUE2 ... )
   where each VALUE is of the form `[SUBSCRIPT]='STRING.  Indexed array
assignments do not require anything but STRING.  When assigning to
indexed arrays, if the optional subscript is supplied, that index is
assigned to; otherwise the index of the element assigned is the last
index assigned to by the statement plus one.  Indexing starts at zero.

 — (info "(bash) Arrays")

Zmicier ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.