![Como testar se um ou mais arquivos com prefixo existem no bash? por exemplo, [[-f foo*]]](https://rvso.com/image/178564/Como%20testar%20se%20um%20ou%20mais%20arquivos%20com%20prefixo%20existem%20no%20bash%3F%20por%20exemplo%2C%20%5B%5B-f%20foo*%5D%5D.png)
Existe uma maneira de usar umExpansão de nome de arquivodentro de umtest
expressão, mais especificamente, umexpressão condicional bash?
Por exemplo:
[[ -f foo* ]] && echo 'found it!' || echo 'nope!';
... irá produzir"não!"se o foobar
arquivo existe no diretório atual ou não.
E adicionando um var
like...
bar=foo*
[[ -f `echo $bar` ]] && echo 'found it!' || echo 'nope!';
... irá produzir"encontrei!"se o foobar
arquivo existir, mas somente se a echo $bar
expansã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!) ls
em um script:
if ls foo* &>/dev/null
then
…
else
…
fi
Alternativamente, find foo* -maxdepth 0 -printf ''
.
Responder2
Baseado emesta resposta, podemos usar shopt -s nullglob
para 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