Как проверить, существует ли один или несколько файлов с префиксом в bash? Например, [[-f foo*]]

Как проверить, существует ли один или несколько файлов с префиксом в bash? Например, [[-f foo*]]

Есть ли способ использоватьРасширение имени файлав пределахtestвыражение, а точнее,условное выражение bash?

Например:

[[ -f foo* ]] && echo 'found it!' || echo 'nope!';

... выведет"неа!"существует ли foobarфайл в текущем каталоге или нет.

И добавляем varлайк...

bar=foo*
[[ -f `echo $bar` ]] && echo 'found it!' || echo 'nope!';

... выведет"нашел!"если foobarфайл существует, но только если echo $barрасширение вернуло только один файл.

решение1

Далее предполагается, что вас не волнует, соответствует ли глоб каким-либо файлам, включая специальные файлы блоков, специальные файлы символов, каталоги, символические ссылки и т. д.

Это идеальный вариант использования для failglob:

shopt -s failglob
if echo foo* &>/dev/null
then
    # files found
else
    # no files found
fi

Или, если вам нужен список файлов, если они существуют:

shopt -s failglob
files=(foo*)
if [[ "${#files[@]}" -eq 0 ]]
then
    # no files found
else
    # files found
fi

Если ошибка «Файлы не найдены» — это можно упростить:

set -o errexit
shopt -s failglob
files=(foo*)
# We know that the expansion succeeded if we reach this line

Старый ответ

Это может быть (редко!) допустимым использованием lsв сценарии:

if ls foo* &>/dev/null
then
else
fi

В качестве альтернативы, find foo* -maxdepth 0 -printf ''.

решение2

На основеэтот ответ, мы можем использовать, shopt -s nullglobчтобы гарантировать, что notify будет возвращен, если каталог пуст:

[[ -n "$(shopt -s nullglob; echo foo*)" ]] && echo 'found it!' || echo 'nope!';

решение3

Для полноты картины приведем несколько примеров использования find:

#!/bin/bash

term=$1

if find -maxdepth 1 -type f -name "$term*" -print -quit | grep -q .; then
    echo "found"
else
    echo "not found"
fi

if [ -n "$(find -maxdepth 1 -type f -name "$term*" -print -quit)" ]; then
    echo "found"
else
    echo "not found"
fi

И несколько тестов:

user@host > find -type f
./foobar
./bar/foo
./bar/bar
./find_prefixed_files.sh
./ba
user@host > ./find_prefixed_files.sh foo
found
found
user@host > ./find_prefixed_files.sh bar
not found
not found

Связанный контент