Como testar se um ou mais arquivos com prefixo existem no bash? por exemplo, [[-f foo*]]

Como testar se um ou mais arquivos com prefixo existem no bash? por exemplo, [[-f foo*]]

Existe uma maneira de usar umExpansão de nome de arquivodentro de umtestexpressão, mais especificamente, umexpressão condicional bash?

Por exemplo:

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

... irá produzir"não!"se o foobararquivo existe no diretório atual ou não.

E adicionando um varlike...

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

... irá produzir"encontrei!"se o foobararquivo existir, mas somente se a echo $barexpansão retornou apenas um arquivo.

Responder1

A seguir, suponha que você não se importa se o glob corresponde a algum arquivo, incluindo arquivos especiais de bloco, arquivos especiais de caracteres, diretórios, links simbólicos, etc.

Este é o caso de uso ideal para failglob:

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

Ou, se você precisar da lista de arquivos, se existirem:

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

Se nenhum arquivo encontrado for um erro, você poderá simplificar isso:

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

Resposta antiga

Este pode ser um uso legítimo (raro!) lsem um script:

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

Alternativamente, find foo* -maxdepth 0 -printf ''.

Responder2

Baseado emesta resposta, podemos usar shopt -s nullglobpara garantir que a anotação seja retornada se o diretório estiver vazio:

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

Responder3

Para completar, aqui estão alguns exemplos usando 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

E alguns testes:

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

informação relacionada